Initial work on nesting graph
Hook nesting graph into ranker
Restore basic cluster support for order phase
Initial work on border segments
More work on basic cases for addBorderSegments
Link up border segments
More positioning work
Use constraint graph for sweeps in both directions
Add debugging for nesting graph / border segments
Rework addBorderSegments

Move addBorderSegments to before the ordering phase, which should make
the algorithm much simpler. Later if we need to optimize this we can
move it back - but then we have a model to test against.

We still need to add some new tests for the new version of
addBorderSegments and there is some cleanup to be done (e.g. to remove
minRank / maxRank from the ordering phase).
Some fixes to subgraph ordering

Definitely need to get some better tests in for this. We still have a
problem with sorting the initial rank.
initOrder now respects constraints

Still need to fill in tests and doc for this...
Move normalize function to its own module
Use Sander strategy 1 for parenting dummy nodes

I have on a separate branch an implementation of strategy 2 for
parenting dummy nodes from Sander, "Layout of Compound Directed Graphs".
Unfortunately, it causes problems with our positioning algorithm because
it allows 2 inner segments to cross.

This approach uses strategy 1 instead, which ensures that no 2 inner
segments cross. This should allow the positioning algorithm to draw
straight lines for all inner segments. In practice, the position
algorithm is still not getting the layout quite right. It is possible
that this is a bug in the positioning algorithm - I need to add a
debugger similar to debug.dotOrdering to output the exact positions of
each node to determine if this is the case.

I'm not totally sure I like this approach. It is definitely simpler than
strategy 2, but it also means that there is always at least one bend in
segments that cross clusters. See the Sander paper for visual examples
of the differences between the two strategies.
Add debug tool for positioning phase
Include edge id in position graph
Treat border segments as dummy nodes for positioning

This fixes the overlap problem in the positioning algorithm for all of
the cases I've tried so far. Previously border segments were treated as
regular nodes, so they were not kept straight if a a non-inner segment
crossed them. Now we use "dummy" to indicate any node that should be
treated as an inner segment for the purposes of positioning.

There is still a lot of cleanup to do in terms of refactoring,
documentation, test cases, and performance tuning. However, this is a
pretty big step forwards in terms of adding clustering support. The work
now should be incremental improvement.