Redesign of our node factories.

The factories were redesigned to support extension.
Library users will now be able to register hub builders.
Once registered in the factory, the hubs can be created by
passing in the builder id along with any extra arguments.
Currently we are using raw function pointers to record the builder routines.

The class hierarchy has shifted a little bit also.
The root group node has a number of extra spokes now.
These include the HubFactory which is used to create hubs.
As well as the NodeGraphContext which houses the NodeGraphState.
The node graph state may also get spokified in due time.

We also extended the hubs concept to allow them to store
weak references to spokes from other hubs.  This makes it more convenient
to find commonly used spokes instead of having to traverse over
connected hubs to find the spoke.  Weak spokes refs are not
deleted when the hub is deleted.

There is one peculiarity with this architecture as is though.
And it is that when you call get_hub() on a weak spoke you
will not get the same hub from which you obtained the initial
spoke from.  We may modify this semantic of the hub and spokes a bit later.

This architecture is also supposed to make it easier to create
new spokes and new hub builder in python and to register them from
python as well.