fix data races in controller

Fix #305
Why do you say it can only be checked once? Do you mean it doesn't work if Alice calls Watch() twice and Betty calls WaitForWatchCompletion() only after the second time? I agree that that would be a bug.

I agree that close() is idiomatic for this in the one-shot case. I also maintain that any code needing to protect a channel creation with a lock is not idiomatic :)

All told, the sync.Cond approach is probably best, though.