ah: bostock uses a fixed transparent overlay to capture all pointer events. behaving much more smoothly & reliably now. :)

mouse zoom/pan working, reset (programmatic zoom/pan) not working.
heyo, programmatic and mouse both working!

no longer using d3.event.scale and d3.event.translate in zoomed(), bc
it's not accessible on programmatic trigger. i don't know what the
difference is. is there a performance benefit to using the event
instead of accessing the attributes of zoom?
hehe programmatic cycling of hotspots is working, this is fun.
some styling i guess? little blurb infobox. also descriptions in hotspots.