Optimized NN-Descent.

We are now using an optimized Map data structure, caching plentily,
avoiding the creation of objects as much as possible, and using a fast,
approximation inverse square root function. The difference between the
similarities computed now and previous differ by less than 1e-4.