Bug #27, filter out sufficiently similar BSSIDs

This adds a filtering step to queries such that BSSIDs that are "similar enough" to each other get collapsed into clusters, and only a single element is chosen from each cluster.

Along the way I added a generic and more-robust (slower but more correct) clustering algorithm and rewrote the existing wifi-clustering operation done as part of position-estimation to use it.

A few tests which were feeding too-similar or invalid BSSIDs had to change but otherwise it seems to work.
I'd keep this function in the service.locate module. It's related to the locate/search logic in my mind.