Add SceneCanvas.screenshot method

Just a start. It implements the ability to render any portion of the canvas at any resolution. 
This is also a good test to ensure that visuals are correctly handling the doc / framebuffer / ndc coordinate systems.

To do:
* [ ] Automatic tiled rendering for very high resolution
* [x] Disentangle logic between `render` and `screenshot` to avoid warning messages.
I still have not unified these, for a few reasons -- `screenshot` and `render` (formerly `export`) do very different things, and these actions are described well by their names. `screenshot` is fast and grabs exactly what is displayed on-screen, whereas `render` actually causes the entire scene to be rendered, potentially in a way that does not reflect what is on-screen. For example:
```
ui_visual.hide()  # Hide transient UI elements before export
image1 = canvas.render()
image2 = canvas.screenshot()
# image1 != image2
ui_visual.show()
```
Furthermore, `render` and `screenshot` share no code at all.