Add the PatitionedSet data structure

The `PartitionedSet' module uses hash tables to implement the set data type with
additional functionality for maintaining a pre-computed partition of the set.

This is necessary in the CFA2 algorithm for an efficient implementation of the
Summaries and Paths sets. Whenever we find a call we search for summaries which
are "information greater than" the called-to push. If a summary's push subsumes
the called-to push, then we need not re-propagate.

In the future, I'd like to provide a general construct for arbitrary
equality/hash-code predicates for sets because that would have made implementing
this much easier.