Finish implementing the viewport widget.

Compared to the previous commit, this commit:

1. Fixes a bug where the child widget would be displayed in the wrong
   position if the viewport widget didn't occupy the bottom left corner
   of the screen.

2. Adds a clipping mask for the viewport, so the child widget is not
   displayed outside the viewport widget.

3. Adds a few convenience methods to the viewport API.  The most notable
   is a method that centers the view on a particular child coordinate.