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.