Add [IO]. Replace [Tcp] by [IO].

NB [Client.create_server] is not working in this commit.
add encryption support

Encryption is not yet supported for incoming connections.  Also, we need
to test the `try-again' mechanism (for when encrypted handshake fails).
Much better reconnection algorithm

See [Client.reconnect_pulse], [Client.rechoke_pulse].
Split [IncompleteMetadata] from [Meta]
Renamed [Meta] => [Metadata]
Streamline the sending of INTERESTED messages

It now takes place periodically in [rechoke_pulse].
peer: better queueing of messages to be sent

will allow to implement cancelling of unsent requests later on
client: improve handling of pex data
Torrent: merge [update] with [create]
Torrent: rewrite the block requester
Torrent: replace [pending] list by an array
Cleanup
Much better piece selection algorithm
Keep track of piece rarity before getting metadata
Peer: support CANCEL message
Eliminate [Client.FH]
Fix piece requesting strategy.

Also, cancel requests that are left outstanding for too long
(currently, 90 secs).
Peer: only keep track of *number* of outstanding requests.
Add [PeerMgr] and [Choker]
Refactor Peer, PeerMgr, Torrent, Client.