watcher: fix more races

Since Event/Error channels are no longer buffered,
we need to consume outstanding values on those channels
in methods Subsystems and Close. The solution is ugly,
but hopefully fixes all remaining races.

The unit test is also much faster now, so we can
run it inside a loop to tigger races.