Refactor: Region: Change internal representation of `Region`

`Region` is now represented internally as (x, y, right, bottom) rather than
(x, y, width, height).  This gives us a way to represent regions which are
infinite, such as the region x < 5, y > 10.  This seems to be a more
natural representation anyway as most of out methods and uses use right and
bottom.

This is not intended as an externally visible change, although some details
may leak through the cracks.  These include:

* The string returned by `__repr__` lists right and bottom rather than
  width and height.  This is necessary as `repr` should be unambiguous.
* If you use subscripting to get at the internal representation of the
  `Region` (e.g. `region[2:]`) this will now return `right` and `bottom`.
API: Region: Add Region.ALL

`Region.ALL` represents the entire 2D frame from -∞ to +∞ in both the x
and y directions.  This is useful to pass to functions that take a
`region=` parameter to say that we want the whole frame considered.  This
is really quite nice as it behaves as you might expect with functions
such as `contains()`, `intersect()` and `extend()` without any special
casing.

In the 0.20 release the only public function which took a `region=`
parameter was `ocr()`.  In this case the parameter defaulted to `None`
meaning the whole frame.  It now defaults to `Region.ALL` with the same
meaning as before.  Passing `region=None` to `ocr()` is deprecated so in
the future we can change its meaning to mean the empty region consistent
with the return value of `Region.intersect()` and the region parameter
of `TextMatchResult` as returned from `match_text()`.
API: Region: Make intersect commutative and associative

`intersect` returns None if the two given regions don't intersect.  By
making `intersect` a `@staticmethod` `None` can be passed as either
argument rather than having to be the second.  This allows constructions
such as:

    Region.intersect(Region.intersect(a, b), c)

or

    reduce(Region.intersect, [a, b, c], Region.ALL)

to behave consistently if any of `a`, `b` or `c` are either `None` or
don't overlap with any of `a`, `b` or `c`.

`Region.intersect` has not yet been in a public release so this is not
considered an API break.
API: Region: Add Region.translate

This is a convenience function implemented to help with the implementation
of passing `region=` to `stbt.match()`