Rework Tags plugin

This PR reworks the Tags plugin and introduces the Widget extensions concept.
- Widget extensions are functions that can be added to a widget as options.extensions (expects a list)
- These functions are run on the widget at rendering.
- This is a hook point to customize widgets, add necessarily new fields, etc.

The Tags plugin:
- Converted from coffee to js.
- It is no longer a plugin but an UI extension, so moved from plugins directory, to ui directory
- The filtering part is gone, since we have a separate plugin for that
- Offers two widget extensions: `configureViewer` and `configureEditor`

Basically, it provides very little benefit but makes the API more opaque. When I'm reading someone else's code, I have to understand that the extensions option causes the extensions to be invoked with the widget instance. If they instead just invoked the extension themselves with the widget instance, I wouldn't have to know this.

Compare:

```js
var foo = MyFoo();
var widget = MyWidget();
foo.addToWidget(widget);
```

vs

```js
var foo = MyFoo()
var widget = MyWidget({extensions: [foo.addToWidget]});
```

It also means that the user must instantiate the extensions before the widget, rather than adding them later. If that is the purpose, then that makes sense. Otherwise, it's just unnecessary.