Various performance improvements:

1) Nodes store their children in a dictionary instead of a list (for
faster retrieval)
2) Results of find() are cached so we aren't constantly walking down the
tree
3) Instead of walking up the tree on every call, increment only
increments the value for a single node.  All of the data is summarized
in a single walk of the tree after the entire input file has been read.