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.
wait why do you want to pass this in? it should always be `crypto/rand.Reader`. cannot trust any other randomness-- exposing it like this will likely create problems elsewhere. I suggest the following instead: inside of `testutil` add a `GenerateTestKeyPair`, which uses the time seeded rand. the interface to the rest of the codebase remains the same (no passing in rand), but tests can opt to use the faster one.