Image registration

This PR adds support for performing image registration on an `Images` object. It is part of the new `improcessing` package, which is designed for image processing routines that are more complex than the simple filtering operations available directly as methods on an `Images` object. The `Register` class is designed as an abstract method that handles distribution; subclasses, such as the initial example `CrossCorr`, implement methods for estimating and applying transformations. 

Key features
- Simple pattern for adding new registration methods
- Helper method for computing a reference image / volume
- Supports both applying the transformation to the images / volumes, or directly returning the transformation parameters

Based on a prototype developed by @d-v-b

@industrial-sloth take a look and let me know what you think?
So, okay, I see what you're getting at with the inclusive=True default option. The difficulty here I think is that everywhere else that startidx and stopidx are specified, the behavior is (currently) exclusive. This means that for instance if I wanted to load a single image, I'd say startiidx=0, stopidx=1; but if I want to select the first image for use in registration, I'd say startidx=0, stopidx=0.

Two reasonable options here I think:
* change this parameter to default to inclusive=False
* agree to change startidx, stopidx to inclusive ranges everywhere in the code (not saying that has to be part of this PR)