Runnable.timeout() accepts values that resolve to zero.

Previously, a timeout of zero caused the test runner to exit prematurely. In the added tests, the failure manifests as a test timeout instead. Now, the tests will run as normal, albeit with an "async" test (one with a `done` callback) running with a timeout small enough that the test is required to complete that tick.

It may not be the most common use case, but the runner should certainly never exit without reporting anything. If there's another solution to this problem that would be more amenable, please let me know and I'll implement that instead.