Add `viewport` to DrawParameters

 * Adds `viewport` to `DrawParameters`, which is set to the whole surface by default
 * Only switch viewport state if needed
 * Panics if requested viewport is too large for what the hardware supports
 * Adds `get_max_viewport_dimensions()` to `Display`

Close #153