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.
Python's re module is known to be a bit slow at times, especially when you don't compile the regex pattern once in the module scope.

I tried a different version with: `[int(hs[i:i+2], 16) for i in range(0, len(hs), 2)]` and that seems to be faster. Tested via a simple timeit call:

```
>>> from timeit import repeat
>>> repeat(stmt="[int(hs[i:i+2], 16) for i in range(0, len(hs), 2)]", setup="hs = 'ab1234567890'", number=100000)
[0.3168489933013916, 0.31794595718383789, 0.31914615631103516]
>>> repeat(stmt="[int(x, 16) for x in re.findall('..', hs)]", setup="import re; hs = 'ab1234567890'", number=100000)
[0.48982691764831543, 0.50811600685119629, 0.49722003936767578]
```