SemElemSet subsumption: refactoring prep

This commit is just a minor refactoring that is dumb except that
it will make the following diff easier to read.
SemElemSet subsumption: return elements to keep, but fake

This commit changes the "does this subsume that?" functions to return
a pair of the items which should continue living, but they are not
really used fully correctly now.
SemElemSet subsumption: renaming

This renames functions so that they make more sense. One side effect of
this generalization is that the function names are now WAY more intelligable
than I could get them before.
SemElemSet subsumption: honor returned elements

These changes may be what is necessary for the generalization to work.
However, this functionality is not tested at the moment; that will come
soon.
SemElemSet subsumption: remove temporary restriction

This changes the enum that used to specify behavior (keep all nonduplicates/keep minimal/keep maximal) to a callback-based version that does not require that the kept element be one of the original ones.

The potential new functionality (returning different elements) is not tested yet.
SemElemSet subsumption: rename identifiers

Rename SemElemSet::SubsumeKeep* to just SemElemSet::Keep*. The original names were mostly because they were originally in the surrounding namespace, so I "namespaced" them a bit more with their name. Now that they are in the SemElemSet class as static memebers, this is no longer necessary.
Add a hash overload to SemElemPair
Undef a temporary #define
SemElemSet::hash() correctly tracked during extend/combine

This wasn't the case before. When add_element_if_appropriate was called during extend and combine, it did not update the hash when elements were added or removed from the current set. This commit fixes that.
SemElemSet subsumption: add tests of new mechanisms

I don't have the BDD version that I need for XFAs, but the SemElemSet side of things is now done.