I just discovered this. If the server catches an exception when handing a client request the socket will be closed but the client in various places is looking for socket exceptions and not a null return from socket.recv, in addition the client code is not correct with respect to gobject.IO_HUP, it needs to immediately remove the io watcher and only then queue a future reconnect request. The problem is the io watch routine will keep firing signaling an IO_HUP if it has not been removed from the watch queue.
The code in question was totally re-written, no evidence of this behavior anymore.