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.
I guess that works too, I figured id just have our function mimic the interface of the RSA key generator and have it accept an io.Reader