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.
This troubles me as well. But here's the problem: `CryptoPeerConnection` ocassionally has to send unencrypted data that contain personalized information, such as `guid`, `pubkey` etc. These data are not available in `PeerConnection`, thus `PeerConnection.send` cannot be directly invoked to send them. The problem deepens once you realise there are cases where an external object must force a `CryptoPeerConnection` to send unencrypted data. See the diff on the `node/transport.py` below.

What I am trying to say is that the encapsulation of the `*TransportLayer` and `*PeerConnection` classes is not good enough and this code only makes it more salient. The fact is, we were already sending unencrypted data inside `CryptoPeerConnection` by (ab)using the superclass' `send_raw`, which is exactly why [this](https://github.com/OpenBazaar/OpenBazaar/pull/809/files#diff-9036db47255df3b3efe7114b5ede3611L241) line suddenly looks horrible once some proper OOP is installed.

I am not saying I like this solution; I don't. However, it's the simplest fix against a deep issue. Perhaps future refactorings will refactor the APIs for good.