Refactored registration

Significant refactoring of registration methods based on offline discussions with @broxtronix and @poolio and Noah (@d-v-b might be interested as well).

The key change is to separate the application and estimation of registration parameters through a new `RegisterModel` class. Performing registration will return an instantiation of this class, and it has a `transform` method for applying the transformations to an `Images` object. This makes it simple to compute parameters on one data set and apply them to another, which was previously difficult.

Other features for improved modularity and extensibility
- Support simple saving / loading of registration models to / from JSON
- Separate particular registration implementations into modules within an `imgprocessing.regmethods` package
- Provide simpler constructor interface through a `Register` class that is separate from the base class `RegisterMethod`
- A new `run` method on registration methods combines the `fit` and `transform` into a single step, which can be more efficient, and matches the old behavior, but does not expose the transformation parameters directly

Example usage
- Compute parameters on one data set and apply to another
```
from thunder import Register

images1 = tsc.loadExample('fish-images')
images2 = images1.medianFilter(2)
ref = images2.first()[1]

model = Register('crosscorr').fit(images2, ref)
alginedimages = model.transform(images1)
```
- Perform registration in one step
```
from thunder import Register

images1 = tsc.loadExample('fish-images')
ref = images1.first()[1]

alignedimages = Register('crosscorr').run(images1, ref)
```
- Save registration model to JSON
```
from thunder import Register

images1 = tsc.loadExample('fish-images')
ref = images1.first()[1]

model = Register('crosscorr').fit(images1, ref)
model.save('/tmp/file.json')

model = Register.load('/tmp/file.json')
```
What about exposing additional arguments to the scipy shift function here via a `**kwargs` parameter?

I'm thinking something like:
* check if `**kwargs` already has a `mode` key
* if not, add `kwargs['mode'] = 'nearest'`
* call `shift` passing in `**kwargs`
* add comments in python docs stating that this implementation also accepts all keyword arguments of scipy.ndimage.interpolation.shift.

(my python syntax may be slightly off in the above, but hopefully the idea is clear).

This would let one call shift with (say) a different order spline or a different mode for edge effects, while not locking the API into one based solely on the `shift` method, in case in the future somebody wanted a different method for reslicing.