Add high-level RasterReader.read

This PR was initiated in #83, but also relates to #71.

Results are normally 3D `band, row, col` if `indexes` is a list, however it may be a 2D array if `indexes` is an integer.

A masked array is returned if either requested `True` or if there is a nodata value with at least 1 value with this within the window. Nodata values may also be NaN, which have unique logic.