dht/pb use peer.PeerInfo
peerstore: PeerInfo func
net/ dialer interface exposes peerstore
peerstore: convenience functions
peer: major refactor. builds
util: fractional context
net: expose local/remote keys on conn
swarm: add remote pubkey to peerstore
fixup! net: expose local/remote keys on conn
dht: split out online record verification

Online record verification -- meaning record verification
that might cause messages to other peers -- presents a
way to perform an attack on a dht node: forge a record and
make the node attempt to fetch the public key to verify.
This becomes a very powerful amplification attack if
online verification is done for records _received passively_.
This means records that were received as the result of a
PUT_VALUE or ADD_PROVIDER. Thus we only accept records we
can verify offline (whose public keys we already have). In
practice this is not at all a problem for us, because
typical connections are encrypted: we've already exchanged
public keys.
dht: three tests pass
dht: protocol change

Send + Recv compressed multiaddrs (bytes). this makes
for much smaller addresses, as string addresses are
inflated for human readability. compare:

```
consider: "/ip4/192.168.10.10/tcp/13456"
string: 0x2f6970342f3139322e3136382e31302e31302f7463702f3133343536
packed: 0x04c0a80a0a063490
```
swarm: learned to use a ConnHandler
secio: remove old debug statements
handshake3: ressurect the message
net: Network has Protocols() and Conn stream chg
IDService (replaces handshake3)
dht: more tests pass
mocknet: now with keys and addrs

To _really_ simulate the network, mocknet needs
to provide proper addrs and keys. Otherwise
services that depend on some of the network's
functionality (like exchanging keys) will fail oddly.

cc @maybebtc
fixup! dht: more tests pass