Architectural change: Shape is a component.

I've switched shape to a component of widgets, rather than something
they inherit; that means it's easier to change the shape of a widget
(just switch out its shape component). Also added a __getattr__ to
BaseWidget that points at the shape component, so trying to modify the
shape's attributes without explicitly referring to the shape (just the
BaseWidget) still works.