Creating a widget registry on the Python side.

Widgets classes are registered on definition of the class using a decorator called `register`.

```Python
@register('custom.Baz')
class Baz(Widget)
    #   ....
```
When not specifying any argument, the view name is used as a key. 
```Python
@register()
class Baz(Widget)
    #   ....
```

The motivation is twofold: 
1- Creation of Widgets from the JavaScript side
2- Graphical gui building interface, that needs to know about a registry of widgets. 

For the latter case rather than using a registry in the form of a `key: widget_class` dictionary as now, we could have some other metadata store with it:
```Python
key: {
    class: widget_class, 
    metadata: {}
}
``` 
The metadata could be used for categorization of widget (control, visualization, container) etc...
The implementation in #6664 will import a module and use the class from that, without needing it in the registry. Assuming we accept that (and I think we should - it nicely parallels loading widgets from require modules in the other direction), is there any use in the `@register()` decorator without an argument? It registers the class with a name that can be used to find it anyway.