Additional cleanup for IO#close exception handling after blocks.
Try to use an existing ChannelFD for native FDs, for close logic.

If we create a new NativeDeviceChannel and ChannelFD, we lose the
closed flag on the NIO channel that would raise an IOException.
Instead, the lower levels of NIO close logic must swallow the
EBADF we expect, and it never gets raised. This is likely a bad
expectation on the part of NIO channel close logic, since the
underlying fd *is* closed, but the channel does not know it.
Make RubyIO.toString use inspect output.
Mask out missing parser warning failures. #2124