Do not choke on unicode keys or dropped connections.

While using the binary protocol, unicode keys caused exceptions. Also, a dropped connection by the server caused the client to busy-loop around a "socket.recv()" call consuming all the CPU it could get.

These changes decode unicode keys into regular strings and view a "recv()" of zero bytes as a closed connection (as it is supposed to happen).