ElementEdge.description()
ElementEdge.is(): resolves a constraint to a value
Rename: constraints/ --> descriptors/
YPosition class
XPosition class
assert.equal provides better error when types are different
XPosition.equals() accepts a number
YPosition.equals() accepts a number
ElementEdge uses XPosition and YPosition value objects
XPosition and YPosition merged into single Position class
Position.diff(): human readable difference in positions
Position.diff() fails fast when comparing opposite dimensions
Position.diff() is comparable to a number
Position.equals() uses .diff()
ElementEdge uses Position.diff()
ElementEdge.diff uses Position.diff for error messages
ElementEdge.diff() uses Position.diff() when comparing vs number
ElementEdge.toString()
ElementEdge.diff turns numbers into position before checking them
Descriptors and values have isScalar() method