export() now allows for one-shot writes

- when used as a context manager, export() clears the canvas, executes
the block, then writes the file (or perhaps more than one)
- when called outside of a `with` statement, export writes out the
current canvas without clearing it