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.
Can we unify `screenshot` and `export`? I think most users will think of them in the same way -- I was confused why there were two methods for very similar input-output relationships. Maybe:

```
def screenshot(self, size=None):
    """Return an image of the current display

    Parameters
    ----------
    size : tuple | None
        If None, the current onscreen buffer is returned. If size is not None,
        the image will be rendered to an off-screen buffer and returned.

    Returns
    ...
```