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.