Only reconnect a host once, defensive locking around close.

Prevent some wait conditions and fail fast when a connection is closed.
Only report to the cluster once that the connection is closed.
Always set read deadline when reading
If the session is closed dont attempt queries
Try all connections from the current position until one is available