Implemented modifications to cache the intersections of derivative classes; however, it seems the performance benefit from memoizing the computation is currently negated (or worse) from a slowdown in HashMap (due to a poorly-designed hash function somewhere?).
Represent derivative classes with HashSet instead of Set since it's faster.
Simplified the hash-code generation function for CharSet, and it seems to have made a significant performance improvement (probably due to many fewer collisions in HashSet and HashMap).
Made a few other trivial modifications for general clean-up.
Removed dead and/or debugging code.