Added CompositeConstraint to handle collections of constraints

This also allows any existing constraint to be 'inversed' without having to be duplicated as a new constraint. e.g. A 'DoesNotHaveClassConstraint' can be achieved by adding the HasClassConstraint to the new CompositeConstraint and setting the mode to 'MODE_NONE'.