I ended up doing a form of clustering:
- at low and medium zoom: quantize events into a grid, take each cell's centroid, and make more populous circles bigger on a logarithmic scale - clicking lists all relevant events - double-clicking zooms in a level - at high enough zoom, break up the multi-event circles by displacing them along a hexagonal spiral
I still get some overlaps from nearby centroids and overlapping hexes, but generally every point can be reached without infinite zoom.