This is a persistent data structure for disjoint sets.
The algorithm is described in Introduction to
Algorithms by Cormen, et al. The implementation here
uses both union by rank and path compression. We
incur an O(logn) overhead because of the use of
persistent maps.
Data.IntDisjointSet is as strict as possible.