Initial merge into juju repository

This PR is the initial merge of previous work into the juju/jujusvg repository.
This *sounds* like a method that just returns information. The side-effects seem
surprising.

Perhaps:

    // layout adjusts all items so that they are positioned appropriately,
    // and returns the overall size of the canvas.
    func (c *Canvas) layout() (int, int)

?