Avoid duplicates in viewer

Fixes #575
Initial support for annotating multiple frames

The host page annotator is split into a host and guest version. The
`Annotator.Guest` class implements most of the behavior from the
old `Annotator.Host`, but leaves out everything to do with the widget
hosting aspects (opening, closing and coordinating drag resize with
the sidebar frame).

The bridge is improved to support multiple connections and multiplex
RPC calls. Connections are established by probing other frames to
discovered other bridge annotators. A frame may act like a DHCP
server, responding to discovery probes and offering to connect.

The annotator service is refactored to behave more reasonably with
service and dynamic frame discovery. Rather than assuming that
document metadata is fetched from a single frame, entities from
all frames are registered when they connect. The Store plugin is
patched to load only links that have not previously been loaded
so that API calls can be made as additional entities are registered.

Most functionality, aside from highlight mode, is broken. This is a
result of the difficulty of dealing with the heatmap when it may be
hard or impossible to determine the real offsets of the annotated
frames relative to the offset of a global heatmap. The changes to
extract the heatmap were left out of this commit in order to keep
the size of an already large commit down.
Move the heatmap outside the sidebar

Inject the heatmap into the host frame using the default embed script.

It will be possible after this to make vanilla embed codes available
which can be used for headless operation or inserting the heatmap in
guest frames.

Fundamentally, the heatmap is altered to behave as though it's inside
the same frame as the annotations. That makes it easier to access
the highlights directly, rather than the pre-resolved jquery that
was being serialized across the bridge before.

Since it is now necessary for the reply counts to be known outside the
sidebar, the bridge is changed to support updating annotations and the
sidebar application is changed to bubble updates through ancestors.

Since iframes cannot have visible overflow the z-index constraints
required to have the heatmap still appear attached to the sidebar
dictated that the controlbar move outside as well.

Adds query parameters when embedding to create embed codes that have
no plugins loaded. This is useful for custom embeddings.

Lastly, I took this opportunity to improve the up/down buckets with the
help of the jquery scrollintoview plugin, which should ensure that
this function works even in situations with nested scrollable panes.

Also, closes #464.
Import quick fix for annotator

We really need to get off maintenance.