PeerConnection cleanup

### Motivation
Cleanup `PeerConnection`; make code simpler and more maintainable.

### Changelog
* Align `send` methods in `PeerConnection` and `CryptoPeerConnection`; drop `send_raw`.
* Disentangle `PeerConnection` from `transport.py`; make classes more amenable to testing.
* Remove excessive `try` blocks. Do not silence really bad errors.
* Use global `zmq.Context` and let it manage itself.
:(

I remember writing a test demonstrating why it was better having a single reference. If this brings clarity and the transport object is not necessary anywhere in the Connection objects I understand.