We export `Expect_test_config` so that the `%expect` syntax uses Async, to prevent a confusing situation in which one is using `Expect_test_helpers` functions, which expect Async to be running, but Async isn't running. Also, we override `Expect_test_config.run f` so that, if `f ()` raises, `run` prints the exception rather than raising. Printing works better with the expect-test workflow than an unhandled exception, because there is a `.corrected` file that one can accept and inspect.

`module IO : sig ... end with type 'a t = 'a Async.Deferred.t`

IO monad

`val flush : unit ‑> unit IO.t`

Flush whatever need to be to get pending output out on file descriptor 0.

`val run : (unit ‑> unit IO.t) ‑> unit`

Run an IO operation until completion

`val flushed : unit ‑> bool`

Synchronous check that there is no pending output on file description 0. With async, there is no guarantee that on the rhs of a `IO.bind (flush ()) ...` the output is completely flushed, that's why we need this.

`val upon_unreleasable_issue : Expect_test_helpers__.Import.Expect_test_config_lib.Upon_unreleasable_issue.t`

`upon_unreleasable_issue` specifies how to deal with output that should not be released even if it is accepted (e.g. backtraces). The default is ``CR`.