Hmm, I'm not sure what's the principle of least surprise, here. If I call io_for without a block should I expect an exception or a no-op.  Given that we already return nil for invalid parameter input, I think we should should treat a missing block the same way. I'd be happy adding a guard that returned :no_block_given_to_io or :no_argument_passed_to_io for failure, and :io_closed or something on success