That's another artifact related to integrating this into the existing design: In the target pool, we block in two places: in the main runner where we wait for the next tick, and at the end of each scrape iteration, we wait for all targets to finish scraping. In both blocking places, we need to allow updating the targets, or the PUT could potentially hang for a long time.

Eh, but now I see that this is actually buggy: the goroutines we wait for push stuff back onto the heap, while at the same time we could be swapping out the elements of the heap. I thought I had ruled this out, but now looking at it again, it looks broken. I think I'll need to rewrite this completely somehow :-/

I'll get to the rest tomorrow...