Large sample optimization

This optimizes scrm towards larger trees. It should be particularly useful if a long exact window or many sample are used. It primarily changes two things:

- Contemporary nodes are now stored in an unordered set instead of a vector. This is a bit slower if we have small trees, but a lot faster once the tree grows.
- I implemented an recursive top-down approach for finding all nodes at a given height. This is faster then the current bottom-up when the tree is big and the height is not at the very low end of the tree. scrm dynamically tries execute to most suitable of both approaches for each situation.

I'll merge this into master as soon as I confirmed that this
- [ ] does not change the results produced
- [ ] improves the run-time