You forgot my favorite one! Xlib is written so badly that there is no graceful way to deal with a connection error to the server - the library gives you one callback to clean up and then it forcibly aborts the process. I looked into why, and its basically because they have no provision for cleanup of failed function calls. If a function can’t return the expected result it would either leave behind a broken internal state of the library or segfault, so they call abort() as a workaround.
If not for this glaring design disaster, it would be possible for a program to attempt re-connecting to a new display server after the previous one crashed. No X11 program has ever done this only because Xlib made it impossible.