fix data races in controller

Fix #305
I guess I don't understand why that would mean you should recreate the condition. You should be able to reuse it?

This whole conversation has convinced me that this fake's watch method is too poorly defined. Can we rewrite it to be less complex? Perhaps by just having it call an injected function, so that the various places it's used can just do the thing they need? We could provide some default functions.