Split client into a consumer and producer.

- We have also added a robust IDENTIFY mechanism (the consequences of certain options, like Snappy, are not yet being handled).
- We now apply a random factor to the backoff rate to prevent thundering herd.
- We now have an outgoing message queue (the first message is always IDENTIFY).
- We formalize incoming messages (namedtuple) (even though the consumer isn't yet equipped to handle them).
- We now have a message sender that blocks until a response (or an error) is received, and then either returns or raises.
- Refactored frame reader to reflect that the frame-type, though static, contributes to the data size.
- Shortened SELECT timeout.
- Bugfixes.