IOManager connect and accept failure handling. Fixes #2910

Wrap exception-causing code with `forwardFailure`. Make `forwardFailure` return `true` when it forwards a failure. Close the channel if it does.

Setting invalid socket options will continue to forward failures without actually aborting the operation. This is a bit unintuitive to me, but I've left the behaviour the same for now. One consequence is that Status.Fail will sometimes mean that the connection/listen operation failed and sometimes mean that it succeeded. Thoughts?

Also is there a reason we're using Status.Fail rather than IO.Fail?