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.
especially since the new network rightfully handles this detail

> // NewStream returns a new stream to given peer p.
> // If there is no connection to p, attempts to create one.