This commit contains various optimizations and simplifications.

* In AtomSeq, now cache both the fact that an operator exists in a associative sequence, and how many times it occurs.
* In AtomSeq, added methods access the operator counts
* In AtomSeq, made the operater cache a lazy val so that the cost of creating the HashMap isn't paid every every AtomSeq
* In AtomSeq, the cache for seen variables in idempotent sequences has also been made lazy for the same reason as above.
* In BasicAtomComparator, fcmp() now uses feq() to do its equality test, and in compare() the result of fcmp() is cached rather than called twice on the same atoms.
* In BasicAtomComparator, removed a lot of dead code.
* In Operator, removed duplication of effort from AtomSeq. Instead, generate a new AtomSeq with the Operator's properties if needed, then do the operations unique to Operator. Namely, associative flattening and commutative sorting.
* In Operator, short-circuit the associative flattening loop once we have found all the operators since we know how many there should be.