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.
can we break this out into:

```
ci.GenerateKeyPairWithReader(...) 
ci.GenerateKeyPair(...) // calls GenerateKeyPairWithReader with crypto/rand
testutil.NewTestKeyPair(...) // calls GenerateKeyPairWithReader with NewTimeSeededRand()
```

_Tons_ of security bugs happen because someone somewhere called a function with the wrong params (something most compilers don't guard well against). I want to minimize the surface area. Particularly if people will be building the habit of using test keys with weak pseudorandomness.