Clean up PeerConnection

* Disentangle 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
* Remove cleanup_context
* Rename create_zmq_socket to _create_zmq_socket
* Simplify updating peer nickname
* Don't decide if the recipient uses ipv6 based on exception thrown
* Since we already reraise the exceptions thrown by _create_zmq_socket there is
  no need to try to catch exceptions at all
* Only compress the data only if we are going to send
* Update tests for PeerConnection to reflect the changes in the cleanup