[MRG] Locality Sensitive Hashing for approximate nearest neighbor search

New PR created from #3304
This is fine, but you could instead have done:
```python
neighbors = np.empty((X.shape[0], n_neighbors), dtype=int)
distances = np.empty((X.shape[0], n_neighbors))
for x, inds, dists in zip(X.shape[0], neighbors, distances):
    inds[:], dists[:] = self._query(x, n_neighbors)
if return_distance:
    return neighbors, distances
else:
    return neighbors
```