Add Disjoint Set Forest data structure

[Disjoint Set Forest](https://en.wikipedia.org/wiki/Disjoint-set_data_structure#Disjoint-set_forests) data structure represents a collection of elements and implements fast subset merging. For each pair of elements it can return whether they belong to the same subset or not. It does not provide an efficient way to split a subset though.

Each individual subset is represented by a tree. Hence the forest.