Timeout implementation for performing operations in the IO monad
with a timeout added. Both using Maybe and exceptions to handle
timeouts are supported.

Timeouts can be implemented in GHC with either a global handler
or a per-timeout thread which sleeps until the timeout. The latter
is used in this module. Blocking on foreign calls can cause
problems as GHC has no way of interrupting such threads.
The module provides a slightly slower alternative implementation
which returns even if the computation has blocked on a foreign
call. This should not be an issue unless -threaded is used.

The timeouts are currently limited to a maximum of about
2000 seconds. This is a feature of threadDelay, but
supporting longer timeouts is certainly possible if
that is desirable.

Like timeOut, but additionally it works even if the computation is blocking
async exceptions (explicitely or by a blocking FFI call). This consumes
more resources than timeOut, but is still quite fast.