3.0 widget registry

As part of #2267, this set of changes adds a registry for creating widgets. It helps address issues around deferring object creation and resolving dependencies. I've tried to keep the code as simple as possible.

I have also decided to try an interface instead of a base class. With only some of the classes sharing a constructor, there just wasn't enough shared behavior to make a base class useful.

My next step after this is to continue building out the remaining widgets.