Sockets have a phantom type parameter that tracks the state of the socket
in order to eliminate certain errors in which socket functions are called
in the wrong order.
A file-descr-watcher is essentially a map from File_descr.t to bool
Read_write.t, which defines the set of file descriptors being watched, and for each
file descriptor, whether it is being watched for read, write, or both.