This will allow us to implement different behaviors depending on the role of the descriptor a File is being accessed through.
FileDescriptor is getting out of control, and the layering isn't quite right so let's make a File class that everything can inherit from. Then we can stop worrying about all kinds of specifics in FileDescriptor.