Extend repr to not-just-tables

The old strategy for `Expr.__repr__` was something like the following

    repr(expr) -> repr(into(DataFrame, expr.head(10)))

This is great for tables, not so great for other things (like arrays and full databases)

Now we explicitly check certain cases (is it tabular? is it scalar?) and do specific repr strategies.  We default to printing out the data, expression, and datashape like so

```Python
In [2]: f = h5py.File('/home/mrocklin/Downloads/OMI-Aura_L2-OMAERO_2014m1105t2304-o54838_v003-2014m1106t215558.he5')

In [3]: d = Data(f)

In [4]: d
Out[4]: 
Data:       <HDF5 file "OMI-Aura_L2-OMAERO_2014m1105t2304-o54838_v003-2014m1106t215558.he5" (mode r+)>
Expr:       _1
DataShape:  {
  HDFEOS: {
    ADDITIONAL: {FILE_ATTRIBUTES: {}},
    SWATHS: {
      ColumnAmountAerosol: {
        Data Fields: {
          AerosolIndexUV: 1643 * 60 * int16,
  ...

In [5]: d.HDFEOS.SWATHS
Out[5]: 
Data:       <HDF5 file "OMI-Aura_L2-OMAERO_2014m1105t2304-o54838_v003-2014m1106t215558.he5" (mode r+)>
Expr:       _1.HDFEOS.SWATHS
DataShape:  {
  ColumnAmountAerosol: {
    Data Fields: {
      AerosolIndexUV: 1643 * 60 * int16,
      AerosolIndexVIS: 1643 * 60 * int16,
      AerosolModelMW: 1643 * 60 * uint16,
      AerosolModelsPassedThreshold: 1643 * 60 * 10 * uint16,
  ...
```

This could be improved.  Suggestions welcome