Redo the operators again to make it more fool-proof to implement.
Add more tests.
Remove the accept(item, boolean) interface to simplify logic.

Instead, we allow an acceptEnd() immediately after an accept, which does
the same thing.
Document, clean up, java8-ify.