Peerstore Fix

This PR changes Net, Swarm, SecurePipe to take a Peerstore.
Whenever they interact with a new peer (say, an incomming conn,
or by somebody calling Dial), it adds the given peer to the Peerstore.

This should fix the problem where peers are at some point given to the
network and/or dht that are not in the peerstore at all. (this panics
atm, to find bugs).
wow, that was complicated. let me try again:

bad:

```Go
conn := listener.Accept(...)
// have no idea what the peer.ID is yet
// say it has created a default peer -- conn.Peer = &peer.Peer{}

handshake(conn.Peer)
// populates conn.Peer.ID. but, at this point, conn.Peer and a peer in global 
// Peerstore may both have the same peer.ID. Swapping peers is bad because 
// people may have stored the old Peer ptr.
```

less bad:
```Go
conn := listener.Accept(...)
// have no idea what the peer.ID is yet
// conn.Peer == nil here. 

handshake(conn.Peer, peerstore)
// gets the peer.ID, tries to load peer from peerstore, and if not found creates one.
// no "temporary" peer.Peer instance created/assigned/leaked.
```