[WIP] Do not try to encrypt unless the public key of the recipient is present

#### Bug
We sometimes try to `CryptoPeerConnection.encrypt` a message while `CryptoPeerConnection.pub` isn't set. To make matters worse, we also return `False` in this case, while the caller is checks for a `None` value. As a result, we end up sending `False` to the other peer instead of aborting the `send`.

#### Fix
Add an assertion that makes sure that we always assign the public key before trying to send; the whole reason `CryptoPeerConnection` exists is that it encrypts and sends messages, so trying to send without a public key is an obvious programming error.
Suggest using `self.send({...}, callback)`.