net-io

(after #442)

This PR changes net to use `io` instead of channels.
At the moment it's just `conn`, but soon more.
Interface looks great. The one critical piece is `AddPeer(peer.Peer) inet.Network`. With that piece alone, we'd have our tests.


With that said...

After that, it's icing on the cake. :cake: :cake: :cake: :birthday: :cake: :pound: :cake: 

```Go
type LinkOptions struct {
	Latency   time.Duration  // probably want a Latency delay.D
	Bandwidth int // in bytes-per-second. LGTM (or BytesPerSecond) there are also asymmetric links
	// we can make these values distributions down the road.
}

type Link interface { // not required immediately
	Networks() []inet.Network
	Peers() []peer.Peer

	SetOptions(LinkOptions) // perfect +1
	Options() LinkOptions

	Metrics() Metrics // this could be handy, but probably low priority
}

type Mocknet interface {
	AddPeer(peer.Peer) inet.Network // perfect. this is the critical piece. this alone gets us 80% the way there (this is perfect as long as it doesn't automatically dial or create connections between any peers)

	Peers() []peer.Peer
	Nets() []inet.Network

	ConnectPeers(peer.Peer, peer.Peer) Link  // peers will probably do this themselves. i can see it being useful for bootstrapping perhaps. +1
	ConnectNets(inet.Network, inet.Network) Link // peers will typically be the ones to do this. but i can see this being useful for bootstrapping perhaps. +1

        // any one of these will get the job done. none of these are immediately critical
	Disconnect(Link) error  // would be weird to disconnect one link and not the other
	DisconnectPeers(peer.Peer, peer.Peer) error // seems the most reasonable
	DisconnectNets(inet.Network, inet.Network) error // would work, but would be less natural

        // either one of these'll get the job done
	LinksBetweenPeers(peer.Peer, peer.Peer) (Link, Link)
	LinksBetweenNets(peer.Peer, peer.Peer) (Link, Link)

	SetLinkDefaults(LinkOptions)
	LinkDefaults() LinkOptions
}

```

Exposing the `Link` immediately will probably make the implementation more difficult/more time consuming. The above is great, but it'd also be totally fine if this all began as:

```Go
type LinkOptions struct {
	Latency   delay.D
}
type Mocknet interface {
	AddPeer(peer.Peer) inet.Network 
	SetLinkDefaults(LinkOptions) // When it comes time to do the implementation, you'll probably want to inject this through the constructor
	LinkDefaults() LinkOptions
}
```