* Perform per-protocol handshakes after connecting
* Initialize the per-protocol Peer and Network states properly
* Add an `EthereumNode` object that can be configured with specific
capabilities and connected to a specific network.
This was done because a cycle was formed between the structures
of the three modules:
- A Peer holds a reference to its Network
- The Network holds a reference to its PeerPool
- The PeerPool keeps a table of connected Peers
I could have resolved the issue by introducing a new types module,
but it would have required all of the currently private fields to
become public (due to lack of package-level visibility in Nim).
Instead I decided to merge the modules because they were relatively
small anyway. Please note that the former `P2PServer` type is now
called `NetworkConnection`. There are slight changes in the APIs
that will be carried out in Nimbus when merging this.
* Make all handlers async
* Added a new `requestResponse` construct that allows you to wait
for the results of a particular request
* Introduced an optional `NetworkState` type for the protocol
* The semantics of `nextMsg` has changed. See the notes in the README