Add searching, pretty-printing, tests

This commit makes it so that, given a tree, you can find nodes in it
matching predicates!

- `find_all`: returns all nodes matching predicate
- `find_all_paths`: returns all paths where the last node in the path
  matches the predicate
- `find_path_ex`: returns single matched path iff it's a unique
  match in the tree
- `find_ex`: returns single matched node iff it's a unique
  match in the tree

Pretty printers:

- `_pprint`: line-by-line pretty printer
- `pprint`: returns all lines of pretty printed output as single
  string

These are not efficiency optimized right now, but for small trees
they should give us a bunch of useful functionality.