Algebras are now visitors.
HammerParserCompactor can compact cyclic graphs.
Adds a parameter to each of the visitor methods to pass self in.

Object algebras can capture the identity of the visited objects, but only by maintaining a stack of visited nodes in parallel to the call stack. This makes it unnecessarily difficult to express several algorithms involving parser combinators, but also allows you to use the algebra protocol to implement a factory.

Since I have no particular need of factories or a solution to the expression problem, and I do have a vested interest in convenient and efficient recursive operations on parser combinators, I opted to make the visitor protocol a little more Visitor-like.

It still retains several interesting benefits of the lazy algebra approach I had taken before, however:

- encapsulation is preserved
- specialization of operations by type does not need to resort to -isKindOfClass:
- lazy recursion is still direct
Merge branch 'feature/visitors-not-algebras' into develop
Null reduction parsers can test equality.
Implements more thorough compaction.
Merge branch 'feature/compaction' into develop
Parsing compacts with HammerParserCompactor.
HammerParserDescriptionVisitor is renamed HammerParserFormatter
That formatting is done with visiting is an implementation detail.
Visiting is technically a subclass responsibility.
Merge branch 'feature/formatting' into develop
Adds an is-null predicate.

It doesn’t handle repetition or recursion correctly as yet, due to using the memoizing visitor where it actually needs to use Kleene’s fixpoint theorem.
The is null predicate no longer uses the memoizing visitor.

Trivially this means that it doesn’t memoize, but it also means that the tests pass—because there aren’t any tests of it with cyclic graphs yet.
Moves the memoizing visitor’s tests up to the top of the file, since they’re the most important bit of the file.
Adds a least fixed point visitor suitable for use with predicate visitors.
Use the least fixed point visitor for the is-null predicate.
The is-null predicate should use true as its bottom, not false.

This means that a concatenation parser, whether:

S → S ε

or:

S → ε S

is null.
Merge branch 'feature/is-null' into develop
The is-null predicate no longer requires symbolizers.