Performant marker popups

Turns out you can't create several thousand popups at once, not if you
want anything else to happen for a while.

To mitigate that, we create popups on demand, and cache them in the
ToroidHandler