WIP: Refactoring NDData

This PR is a companion to astropy/astropy#2855 and also came out of the NDData telecon. The goal is to simplify the base NDData class so that the base class becomes a simple container for data interchange.

The arithmetic methods on the current ``NDData`` are factored out into an ``NDarithmetic`` mixin class. The class ``NDDataArithmetic`` is include as a convenience and works as a replacement for the current ``NDData`` (I've check that the current ccdproc tests pass if I make make one change to the code: subclass from ``NDDataArithmetic`` instead of ``NDData``).

I've also moved the ``NDData`` arithmetic tests into a separate file.

**edit 9/30/2014:** the ``flags`` property is also removed from ``NDData``.
**edit 10/2/2014:** Uncertainty and mask implementation moved from ``NDData`` to ``NDDataArithmetic`` and removed automatic conversion of ``NDData`` to a numpy array. Updated task list.

A rendered version of the documentation changes is [here](http://physics.mnstate.edu/craig/astropy/nddata).

Still not done:
- [x] Remove checks for ``FlagCollection`` shape (should this be done?)
- [ ] ~~Attempt to make ``mask``, ``unit`` point to the ``mask`` of the data (if it has one) instead of separating the mask from the data, and the same for the unit.~~
- [x] Fix doctest failures
- [ ] Update docs to reflect 

@Cadair -- please check to see whether this revision has ``wcs`` working the way you wanted.

cc  @astrofrog  @cdeil @perrygreenfield @crawfordsm @larrybradley @adamginsburg @bsipocz 
Actually the fact you have ``@abstractproperty`` automatically ensures subclasses have to implement it. Does that mean you should remove the exception and also remove ``@abstractproperty`` from other properties if you are not requiring subclasses to override them.

Example: if I do:

```python
import abc
import six

@six.add_metaclass(abc.ABCMeta)
class Test(object):
    
    @abc.abstractproperty
    def test(self):
        return 1
        
class Test2(Test):
    pass
    
t = Test2()
```

I get:

```
TypeError: Can't instantiate abstract class Test2 with abstract methods test
```