The Close module exists to collect close and its associated types, so they
can be easily reused elsewhere, e.g. Unix_syscalls.
type file_descriptor_handling = | Close_file_descriptor of socket_handling | 
| Do_not_close_file_descriptor | 
val close : ?file_descriptor_handling:file_descriptor_handling ‑> t ‑> unit Async_unix__.Import.Deferred.tclose t prevents further use of t, and makes shutdown() and close() system
calls on t's underlying file descriptor according to the
file_descriptor_handling argument and whether or not t is a socket, i.e. kind t
      = Socket `Active:
        | file_descriptor_handling                     | shutdown() | close() |
        |----------------------------------------------+------------+---------|
        | Do_not_close_file_descriptor                 | no         | no      |
        | Close_file_descriptor Shutdown_socket        | if socket  | yes     |
        | Close_file_descriptor Do_not_shutdown_socket | no         | yes     |The result of close becomes determined once the system calls complete. It is OK
to call close multiple times on the same t; calls subsequent to the initial call
will have no effect, but will return the same deferred as the original call.