Custom rdds: support loading from multipage tifs

Main change is supporting reading from multipage tif files using PIL/pillow, if either of those libraries is installed and available. 

A few additional minor changes:
* spark context "sc" used by ImagesLoader moved to __init__ argument from individual load method arguments
* stack dimension "dims" parameter moved to fromStack argument from ImagesLoader __init__ argument
* file extension "ext" keyword argument now exposed on all user-level functions. (Use case is for files saved with slightly nonstandard extensions, like .PNG or .tiff)
Yeah I was rather of two minds on this issue. I ended up thinking no, just let imread itself complain if it can't read the file. The fact that imread is based on PIL is an implementation detail of imread; we shouldn't have to know how it's implemented in order to use it, or try to outsmart it by performing checks on its behalf. On a more practical level: imread fails quickly and hard if PIL isn't available, so we're not hurting performance by deferring that check until the imread call.