When following edges we keep track of what edge characters are allowed
next. These prevents following edges such as:
And fixes a bug where, when trying to find parent nodes for B, we'd
traverse from B to \ to A in situations like this:
The edge-traversing algorithm is now much more data-driven. We use a
hash that describes what to do next for each type of edge character, as
well as what to do at the very start of the search.
This changed the sort order of parent nodes in some situations. We
should probably apply some overall sort to the parent nodes so they
aren't so sensitive to the traversal algorithm.
Fixes #5. Also improves #7 slightly, because there are no longer arrows
pointing from numbered labels to nodes. There are still circles around
the numbered labels though.