Represent widget constraints as data objects
Move ConstraintSpecification trait out of Widget.scala