Pull cross counting and edge marking out of the ordering algorithm

Quite a few changes here - my original plan to recalculate :minus-ps
and :minus-qs twice - once for ordering and once for cross counting
didn't work out. :minus-qs requires going through almost all of the
ordering algorithm again, due to segment containers not being fully
normalized in :minus-qs. replace-nodes-with-edges was linear, so it
wasn't a great solution anyway. Instead, I'm storing :minus-ps and
:minus-qs on OrderedLayers as needed.

This change adds CountedAndMarkedGraphs as an intermediary
transformation in between the old OrderedGraph -> FlatGraph flow. This
was made possible by implementing the short circuit of the ordering
algorithm based on seed layer equality, rather than cross count
equality as I had planned (and as I had done in javascript). Thanks,
Clojure, for making this super easy. Anyway, cross counting and edge
marking now come after the ordering phase, and running that algorithm
can be parallelized across all of the OrderedGraph candidates. It's
a O(edges log nodes) algorithm, and the slowest part of the whole
process, so this is a pretty decent win. The earlier short-circuit
than was possible with crossing cycle detection doesn't hurt either.

Along the way, I also implemented the Reversible protocol on
SparseGraph and OrderedGraph. Soon I'll do more of this in a more
intentional way, rather than the ad hoc manner in which I've been
doing it up until now.