rewrite of provides to better select peers to send RPCs to

The main change in this PR is the implementation of `getClosestPeers` that returns a channel of peers. progressively closer to the target key. This is used to put provider values to the best possible peers.
low priority but the latter would make more sense than the former

```Go
func (rt *RoutingTable) Find(id peer.ID) peer.ID
```

```Go
func (rt *RoutingTable) Exists(id peer.ID) bool
```