What I mean when I say the client get's to decide, it will want to check that the
server provides say, HypervisorResourceV2. 

Client defines a
```
class HypervisorV2RequireResource(Resource):
     version=2
     def matches(self):
          if self.supports_version(self.version):
               return True
         return False
```

or 

```
class HyperVisorTakesHypervisorConsumerRequireResource(Resource):
     def matches(self):
           # could check for a specific resource version
           # or it could look for a 'has_hypervisor_consumer' attribute 
```

You build container of available resources, a container of required resources, and
a class to class to match/filer them and build a container of Resources().

supports_resource() would become a check if that Resource is in Resources().