Initial merge into juju repository

This PR is the initial merge of previous work into the juju/jujusvg repository.
Given that Canvas methods are defined on the pointer type, it would be
conventional to use *Canvas throughout.