KD-Tree and Ball tree added in a unified interface

- ball tree added
- kd tree added
- max heap data structure added for utility purposes
- both trees unified under common interface - ```NbodyTree```

I see that this KNNHeap class is only used from NBodyTree (why is it KNNHeap btw? Is it just the standard heap data structure?). I am wondering then if we could just use STL's heap functions so we don't need to code our own data structure.

I see you have a private method that takes a heap as an argument. Would it be too cumbersome to change the design slightly so there's no STL in the header but we can still use the STL's heap functions in the implementation file? I think it should be all right, you could for instance pass the heap to the method as an SGVector and when you need to use heap operations in the cpp file you just give the pointer to the data in the SGVector to an std::vector (this operation might be dangerous though, check STL vector's doc if you decide to go for this design).