I forgot about the `concurrent map write` race, but now it's fixed. I suppose we could probably pre-create all semaphores in the graph at once before Start, and remove this lock, but that's an optimization for a later day.