Replaced Metadata regexes with new string matching code.
Added Metadata signals emitted on registration of values.

This should be useful for updating UIs automatically when Metadata changes.
Added Metadata signalling when dynamic Box metadata changes.
Removed DisplaysPlugValueWidget._childPlugWidget().

The same can be achieved with a PlugValueWidget registration. I'm aiming to reduce the number of implementations of these special methods of CompundPlugValueWidget, with the aim of eventually removing them all, making the codebase easier to refactor.
Reimplemented StandardNodeToolBar with new GafferUI.PlugLayout class.

The old internal implementation was vulnerable to plugs changing names, as documented in the comments. The new PlugLayout class doesn't have this vulnerability as it uses the fact that IECore.Refcounted __hash__ and __eq__ are now implemented sufficiently to use a RefCounted object as a dictionary key. The same vulnerability exists in the implementations for CompoundPlugValueWidget and StandardNodeUI - the intention is to refactor both of these over time to use the PlugLayout class, and improve the PlugLayout to allow sectioning driven by Metadata, allowing it to provide user-designed UIs for the Box class.

It's necessary to introduce a new class here rather than improve on CompoundPlugValueWidget for a couple of reasons :

- CompoundPlugValueWidget can only display plugs which are children of other plugs - as it derives from PlugValueWidget it must accept only parents which are themselves Plugs. This makes it unsuitable for use in the top level uis in StandardNodeUI, where the plugs are held directly on a Node.
- CompoundPlugValueWidget has become quite unwieldy with many subclasses implementing various _protected() methods that customise its behaviour. Over time we should replace the CompoundPlugValueWidget internals with PlugLayout too, but that will be a bigger undertaking whereby we'll have to deprecate various things and rejig several derived classes. In the process of doing this we need to reduce the coupling between all these components, using Metadata as much as possible to control behaviour instead.
Reimplemented UserPlugValueWidget using PlugLayout.

This will allow us to move forward with the PlugLayout for customising Box UIs. Ideally we'd be reimplementing the CompoundPlugValueWidget too, but as described in the previous commit, this is problematic at present.
Implemented PlugLayout updates triggered by Metadata changes.

Currently this just allows dividers to be added and removed on demand.
Added Box setNodeMetadata() and getNodeMetadata() methods.

These will allow the specification of per-instance node metadata for Boxes, in the same manner as the existing per-instance plug metadata.
Fixed Metadata signal bindings to not expose InternedStrings.

These are useless in Python, so we use standard python strings instead.
Made NameWidget accept None for the the GraphComponent.
Added borderWidth argument to SplitContainer constructor.

This behaves in the same manner as the borderWidth for GridContainer, ListContainer, Frame etc.
Added PathListingWidget setHeaderVisible()/getHeaderVisible() methods.
Added PathListingWidget.pathAt() method.
Updating current selection in PathListWidget.setSelectedPaths().

The QTreeView supports a set of selected (highlighted) items, and also a "current" item, which is not necessarily selected but is the focus of keyboard operations and the like. The call to selectionModel.clear() clears both of these, so it's good to place the "current" item back at the top of the selection so that keyboard operations start where the user would expect.
Added GafferUI.BoxEditor to allow editing of Box UIs.

This will form the basis for creating custom UIs for GiftBoxes and References.
Added layout reordering to PlugLayout.

This is controlled by a plug Metadata entry called "layout:index", which is used to sort the plugs before generating the UI.
Fixed PathListingWidget.pathAt().

There was an offset in the result because Qt expects the coordinate to be specified in the space of the viewport rather than of the parent widget.
Fixed bug in GafferUI::Pointer::setFromFile( "" )

It should have been resetting the pointer (as documented) but was instead erroring.
Added a DictPath.dict() accessor.
Fixed initial unsortedness of PathListingWidgets.