formalize valid requirements specifications

From the discussion [here](https://github.com/jonboulle/fleet/commit/1b42558dad5e378954893669e57e25d1d804115d#commitcomment-6982201)

Basically, from the set of all possible fleet requirements:
- `X-ConditionMachineID` 
- `X-ConditionMachineBootID` (can we scrap this?)
- `X-ConditionMachineOf`
- `X-Conflicts`
- `X-ConditionMachineMetadata`
- `X-MachineMetadata` (can we scrap this?)
- `X-MemoryReservation` (gone)
- `X-DiskReservation` (gone)
- `X-CoresReservation` (gone)

... we need to define which subsets are valid, and I strongly favour blocking invalid permutations at the earliest point (e.g. `fleetctl submit`, API submit)

For example, `X-ConditionMachineID` cannot be used with `X-*Reservation`, or `X-FleetConflicts`, or `X-ConditionMachineOf`. Effectively, `X-ConditionMachineID` triggers a "do not perform any scheduling for this job" condition, and hence is suitable for use by upstream schedulers.

I don't care nearly as much about the helper functions as I do sharing the fixtures generated by those functions across dozens of tests.