fix data races in controller

Fix #305
Ah, OK, I think I now understand what it is that you're trying to do. Sorry, I was having a lot of difficulty understanding the first version. :) 

Thoughts:

I think WaitGroup is intended for single use only, so my previous suggestion wasn't correct, sorry.

I think the construct you actually want to use for this is a sync.Cond. I can also see a solution using a channel like your first solution, but for that you'd want to pre-create the channel and send a value at the end of the Watch function instead of closing it.

(It's moot, but there's also no reason to add 3 and call done 3 times.)