Added additional methods to help Solution

Changed Equation and Expression to have a convenient "identifiers" method that
gives you a set of all of the identifiers used within them. This helps
instantiate my partial solution data structure.

Revised the partial solution data structure, putting it in its own class within
the Solution object. It maintains a set of all currently used names, a
union-find to keep track of the equivalence classes of names, and a map from
names to partial f-structures (with names in them).

Added a super-basic persistent union-find data structure. In the future, I may
want to implement a more efficient one (if the solution pans out...or even if
not. It'd be fun)

Everything is truly in place now for the last bit of the Solution algorithm to
be implemented...it is finally happening.