[WIP] Simplify UI.Highlighter API

Rather than working with annotation objects, the `UI.Highlighter`
component receives ranges directly and returns highlights. It is
now the job of the caller to determine what to do with those
highlights and when to undraw/redraw them.
This also belongs in the highlighter module as it's part of a highlight, and should be applied even if a user implemented an annotator without the default UI. This may mean that we need to provide ids when we draw the highlight, e.g. `highlighter.draw(ranges[, id])` which I think is an acceptable api signature.