Clean up PeerConnection

* Untangle PeerConnection from transport.py
* Let create_zmq_socket throw exceptions and handle them in send
* Do not guard zmqstream calls from exceptions as these happen on
  programming errors
* Guard json.loads from exceptions that may be thrown while processing a
  message that came from the network
Rename create_zmq_socket to _create_zmq_socket
Simplify updating peer nickname
Don't decide if the recipient uses ipv6 based on exception thrown
Simplify send even more

* Since we already reraise the exceptions thrown by _create_zmq_socket there is
  no need to try to catch exceptions at all
* Compress the data only after we are sure we are going to send the message
Update tests for PeerConnection to reflect the changes in the cleanup