Add apply_as_mask operation

I had a need for an operator like this when I wanted to apply a circular layer mask to an image. I thought it might be useful for others too!

Starting with an image, you create a canvas of the same size with a white background. Then you 'colour in' bits of the new canvas black. Use `mask.apply_as_image(image)` to modify the mask replacing all black pixels with their respective image pixels.
It makes more sense to me if this method is called `apply_mask`, where the `other` canvas is the mask.

Also, I think we should have `apply_mask!`, which modifies the current canvas, and `apply_mask`, which returns a new one. `apply_mask` can simply be implemented as `dup.apply_canvas!(other)`