Refactor to avoid renders and add tests

Rather than watching a bunch of subproperties, the most complex of
which are the targets, deep watch the whole annotation. The targets
were being deep watched already. This just seems much easier and
clearer than debouncing the render calls, and scales to whatever
properties much change in the future. We'll re-evaluate if this
becomes a bottleneck.