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.
`KValue` (aka `count`) is declared as

> K is the maximum number of requests to perform before returning failure.

It's difficult to understand the relationship between the `count` parameter and the number of elements returned in the response channel.