Provide a parse tree view to solve issue #12

Add a `tryParseTree()` method to `Parser`. The code has been tested against a relatively complex project of mine. The result is satisfactory to me. You can review the test cases to see the result.
So I slept over the idea of extracting interface. But some of it feels to me like overkill. I'm sorry for suggesting it in the first place!

ParseContext was an abstract class with many of its methods final and some fields even accessed directly. It gives us some performance benefit over dynamically dispatched method call.

This is just one extra piece of data. I wonder whether we could instead introduce the ParseTreeContext as an interface, and make it part of ParseContext. The reason we need polymorphism is because we want to be able to save the cost of building tree during parse(). But that's doable with a dedicated TreeContext:

```
interface TreeContext {
  /** Creates a new child node of the current node, and set it to current node. */
  void push(String name); // called at beginning of a NodeParser
  /* Set the current node back to the parent node. */
  void pop(); // called at the end of NodeParser in a finally block

  /** Returns the current state of the tree. Used by OrParser before trying alternatives */
  State currentState(); // called at beginning of OrParser and friends

  /** Set the tree state back. Used by OrParser after each failed alternative. */
  void resetState(State); // when OrParser backtracks.
}
```

Goals:

1. Minimize work during parse() time. So instead of creating a TreeNode in NodeParser, just pass the node name to push() so that at parse() time it can be made a no-op.
2. We can assume that the tree parser is less performance critical. So the currentState() and resetState() don't have to be super fast, though nice to be (with a cons list, it's probably just a matter of remembering and restoring the list).
3. By default, ParseContext.getTreeContext() returns  a null object (not null reference!) that does the most trivial thing.
4. TreeParser can create a real TreeContext instance, set it in the ParseContext (and remember to clear it before returning from apply()).