Machine type

This adds an interface for a machine type, which determines whether its required resources to construct are present. Each machine type is linked to a manager, but a manager wouldn't necessarily have to be only for a particular type. This avoids having to create a manager class for each type of machine - separates information about the type of machine from the collection of active machines.