Set metadata step and convergence cleanup

Move some of the cleanup code and the SetMetadataItem functionality from #727 to here, so #727 can be smaller.
It isn't actually an instance of `NodeTypes`.  :|  I think bug has been filed with Twisted to try to have some way of validating that something is a `NamedConstant` in a particular `Names` object.

    >>> class Thing(Names):
    ...    THINGTYPE1 = NamedConstant()
    ... 
    >>> type(Thing.THINGTYPE1)
    <class 'twisted.python.constants.NamedConstant'>
    >>> isinstance(Thing.THINGTYPE1, Thing)
    False