New net interface

Thoughts on making an implementation of the  `msg.Message` interface that only marshals out when `Data()` is called? i.e. the internal storage is whatever you want (i.e. not a protobuf). this might be a better way to do service-specific messages.

```Go
// inside bitswap
type Message {
  Peer *peer.Peer
  WantList ...
  ...
}

func (*Message) Data() []byte {
  // constructs PBMessage, then marshalls out to []byte and returns it.
}
``` 

though idk, maybe it's not such a big deal to use the PB generated structs everywhere. (their total disregard for golang naming conventions is annoying... i bet that's a fun internal goog conversation)