Use polling instead of watchers

It's too flaky otherwise, and occasionally the events come in the
wrong order.

Rather than use a watcher, just keep trying until the time runs out.

It's not as elegant, but it also doesn't deadlock on Linux machines.
v0.3.0