Delay before hover preview

* Changes providers so they're not responsible for showing popover. They return an object with the info needed to show one later.
* Add a `popoverState` object that can represent both visible and pending (waiting on timer) popovers.  If mouse movement invalidates the popoverState, it is canceled -- hidden if visible, timer stopped if pending.
* Unrelated minor fix: ignore mousemove while dragging.
* mousemove processing is now slightly more efficient: we don't reprocess the same line:ch pos repeatedly, and if a popover is already pending/open we don't do any more processing until the mouse leaves that popover's range of text.