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.
I may be overlooking. It seems that a child is added to the parent node and it isn't ever removed.

In a parser of this structure: 
```
a.node("a").followedBy(something)
    .or(b.node("b"))
    .followedBy(blah)
    .node("parent")
```

When parser a matches, the node "a" will be added to the node "parent".
Then if the ```followedBy()``` parser doesn't match, we will backtrack to try the alternative parser b.
But in this case is node "a" still staying in node "parent"? If so, the end result may be that parent node contains both "a" and "b", while in fact only "b" matches.

If I'm not overlooking, I think we need to implement children with a singly-linked immutable list (similar to list in Haskell, where you can ```cons``` to create a new list, while the original list never changes). That way, when OrParser backtracks, it can reset the children nodes state easily in O(1) time as:

```
if (p.run(ctxt)) {
  return true;
}
ctxt.set(step, at, result);
ctxt.setChildrenNodes(originalChildren);
```