ui: Extract Highlighter component and plugin

This commit shows the way for a couple of new patterns.

First, the way that the DefaultUI plugin is responsible for composing
the new UI components should be beginning to be clear.

Second, the division of the Highlighter into a domain-specific
Highlighter component in the UI module, as well as a thin wrapper plugin
that can, if needed, be used on its own.
ui: Move Widget into UI module
ui: Extract Editor component and plugin

Just as with the Highlighter in b911724, this commit moves the bulk of
the Editor functionality into the UI module. There remains a skeletal
Editor plugin, which admittedly isn't terribly useful on its own, but it
is included for completeness.

As part of this work, the #load() method of the Editor was refactored to
return a promise (resolving if the editor is submitted, rejecting if
cancelled) rather than having a "private" event handler on the Editor
itself.
ui: Extract Viewer component and plugin

Moves the bulk of the Viewer functionality into a decoupled object that
lives in the UI module. The Viewer plugin becomes a thin wrapper that
wires up aspects of the viewer's behaviour to the relevant registry
functions.