check return value of zmq_socket

I reverted the commit where I played around with passing an optional context to zmq.socket().
Also, throwing an uncaught C++ exception never printed the error message to my terminal so I just use fprint(stderr, ...) and exit.
It looks strange, but this sort of is the only way, keeping the existing behavior. It is equivalent to the existing implementation, but is guaranteed to print the message. This was an unhandled exception, so it should terminate the process. Don't want to do silent failure, and I can't come up with a good way of continuing.

Equivalent, but convoluted would be to catch the `runtime_error`, print its message and then exit. This avoids the unnecessary exception creation and handling.

The underlying issue is simply that an implementation is not required to print `what()` from unhandled exceptions. This change guarantees that the message is printed.