This adds CanvasPathClipper and ScopedCanvasPathClip. These allow clipping the canvas by some arbitrary path. This initial implementation is fairly naive, with a good few allocations, though this can probably be improved in future.