rewrite FindProvidersAsync

This PR implements a better `FindProvidersAsync` call that uses the query framework and actually takes advantage of closer peers.
`AddIfSmallerThan` is a method on the peer set that will  add the peer to the set and return true if the peer was not in the set and there is space left in the set, all within locks. That way we avoid a potential race condition. So the logic changes to:

```
if ps.AddIfSmallerThan(peer, maxSize) {
    process(peer)
}
```