Made a protocol for groups.
Moved d4 into a record for the group protocol. Hope this works out.
Much of the old code needs refactored now. For example, the multi-variadic
star code needs reworked.
Added an ints-group record that fulfills the group protocol.
Added a couple of tests and moved a few functions around.
Added "inverse" and "ident" functions to the group protocol.
The int-group's inverse is currently broken. This is documented via
the unit tests.
Refactored conjugate.
To do this I realized that I needed a variadic operate function.
The base case of the operate function is different for each group,
but the multi-argument case is generic since it recursively applies
using the base case operate function.
Therefore I changed the group protocol to have an operate-internal function,
and to have operate exist outside the protocol. Fortunately this works pretty
cleanly in Clojure.
Refactored normal? .
Refactored cycle-to-set.