[r=wallyworld] Add constraints validation to providers
Each provider has a constraints validator which is used when setting constraints on a machine or service, as well as when constraints are merged. The validation step allows conflicting constraints like instance-type and mem to be rejected, and also unsupported constraints to be logged with a warning. The merge step allows things like instance-type to mask other incompatible constraints like mem or arch, and visa versa.