fix data races in controller

Fix #305
I find this really confusing. Why are we closing and recreating a channel? "close" means that logically speaking, we desire no further values to be sent on the channel. Yet we recreate it, and have a lock to guard its creation? Is sync.WaitGroup perhaps a better match for the requirements here?