Added graph layout algorithm and Edit/Arrange menu item.

The algorithm is invoked via a new pure virtual GraphLayout::layoutNodes() method, which is implemented in the StandardGraphLayout class. The StandardGraphLayout uses a new internal LayoutEngine class which converts the GraphGadget contents into boost::graph form, and then uses a hybrid combination of force directed layout and hard constraints to produce something resembling a sensible layout, before transferring it back to the GraphGadget.

The hybrid approach was necessary because existing layered graph drawing algorithms don't apply too well to our graphs where connections flow both left->right /and/ top->bottom. Pleasingly, it also can be seen as a generalisation of the existing system we had for positioning nodes one at a time in positionNode() or as a group in positionNodes(), where the former soft constraints are treated as springs and iteration over the hard constraints is used to allow more complex constraint relationships to be resolved, along with collisions. This means that positionNode() and positionNodes() are now implemented using the same LayoutEngine as layoutNodes().

Hopefully fixes #638 sufficiently to be given a go in the wild before we make new issues for further refinement.
Fixed TextGadget vertical bound.

It is now always big enough to fully enclose any character in height, rather than changing height when taller characters are added or removed. This fixes StandardNodeGadget heights which were dependent on the node name.
Updated GraphGadget for new layout code.

Removed inappropriate call to positionNode() in GraphGadget. There's a significant overhead to this now, and it's also unnecessary, because the creator of the node is responsible for calling one of the layout functions at the appropriate time. Removed \todo which suggested that GraphGadget should automatically figure out the right thing to do get new nodes laid out properly - I now think that this requires external knowledge unavailable to the GraphGadget (e.g. is this an import operation, or a paste, or a new node, or a whole load of scripted operations).
Added failing NodeGraph test case.

The problem is that GraphGadget makes a position plug immediately upon a new node being added, in addNodeGadget(). But when a node with an existing position plug is being pasted, it will add a second position plug immediately after, resulting it being named and becoming a useless duplicate. Perhaps ideally we shouldn't add the plug at all in addNodeGadget(), but we currently rely on it existing in offsetNodes(), so it's not totally clear what the best approach is.
Merge pull request #745 from johnhaddon/constrainedLayoutRebased

Automatic graph layout