Negative dimensions based on parent width/height

If a `width` or `height` are negative, we'll base the dimensions relative to the parent (if the parent is present).

As the relative + negative calculations got more complicated, I factored it out into smaller methods with a little meta-programming to glue it together. Hopefully the small methods and naming keeps that straight-forward.

I also added shared spec examples for negative dimensions across the DSL types that used the relative dimensions shared example before. The negative functionality is also independently tested against the `Dimensions` class itself, so I don't know whether those shared examples are superfluous or helpful on the whole, but I thought I'd add them anyway.

Should resolve #411.