Do not send disconnection/failure delegate methods until we've fully
cleaned up.

This fixes a horrible race condition where the delegate call is made
(e.g. didDisconnect), and in response an attempt to reconnect is made,
which creates a new socket, and *then* we set the socket to nil,
resulting the socket being lost.

This probably explains a number of mysterious connectivity issues that
have been reported.