Allow and encourage the use of file objects instead of integer fds in IOLoop.

This fixes a problem in tests in which a closing IOLoop would os.close()
all of its file descriptors while socket objects for those fds still
existed.  When those socket objects were garbage collected, they would
close the fd a second time (by which time it may have been reassigned
to a new socket).

Due to subtleties of garbage collection this has only been observed
with the asyncio event loop in tests of curl_httpclient.