[WIP] Locality Sensitive Hashing for approximate nearest neighbor search(GSoC)

Firstly, `np.packbits(projections).view(dtype='>u4')` should be pulled out as a helper function.

Secondly, repeated calls to this with `[0]` is going to be much slower than a vectorized operation (i.e. this packbits/view operation can return an array of 32bit integers, given a `[n_hashes, 32]` binary input). Instead of passing in `tree_n` and looping over trees in the calling function, just get hashes for all trees at once here.

Thirdly, you say:
> conversion from list to tuple and dictionary lookup is fast but when using numpy arrays, these operations are slow.
Note that `list(my_array)` is 10x slower than `my_array.tolist()`. But I still expect the above to be faster or as fast once you've properly vectorized the loops.