Dotted name support for type registration

Now the registration functions take keyword argments and a factory
to pass them to instead of taking the implementation instance.