The original AsyncJob drainer() has `try: except: pass` wrapped around the whole thing, which is bad form and makes no sense, but it made me think exceptions were being ignored for a reason.

I agree, we should release() in a `finally` so that get_stdout() and get_stderr() can access the buffer without deadlocking even after the drainer thread has raised an exception.

I'll try to make some units tests for this case.