Allow reconnect on connection loss with retry using ReconnectStatusListener

This is the combined solution we discussed via email.
You are correct. `CONNECTION_CLOSED` is used when the server process dies. `TIMEOUT` is used when there is an issue with the network connection, or if the socket on the server is not closed. You want to handle both of these cases.

However, `CONNECTION_CLOSED` can also come from closing the client instance. You can keep a reference to the `ReconnectStatusListener` object in `ClientImpl` and shutdown the `executor` before `m_distributor.shutdown()` in `ClientImpl.close()`. This prevents the client to auto-reconnect when you explicitly shuts it down.