Fix shape attribute for MultiIndex
This fix ensures that `idx.shape == (len(idx),)` if `idx` is a MultiIndex.

Also added tests for other ndarray compat properties.

hmm these should be the same
is something failing?
 @jreback here's what I found on master:

```
In [1]: import pandas as pd

In [2]: idx = pd.MultiIndex.from_arrays([['a', 'b'], [0, 1]])

In [3]: idx
Out[3]:
MultiIndex(levels=[[u'a', u'b'], [0, 1]],
           labels=[[0, 1], [0, 1]])

In [4]: idx.shape
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-f9305225184b> in <module>()
----> 1 idx.shape

/Users/shoyer/dev/pandas/pandas/core/base.pyc in shape(self)
    298     def shape(self):
    299         """ return a tuple of the shape of the underlying data """
--> 300         return self._data.shape
    301
    302     @property

AttributeError: 'NoneType' object has no attribute 'shape'
```
 this is a little odd because a MultiIndex is 1-d. So this could be a bit confusing. `len(idx) == shape(idx)[0]`
 IMO MultiIndex can be unambiguously interpreted as a 1d array of tuples. I don't think it's surprising to have `len(idx) == shape(idx)[0]` -- that's exactly the case for any 1d numpy array. All the other indexes already have shape defined (in the same way).
 I know but you want to return `(5,20)` or something right? (e.g. tuple of length of levels)?
maybe could make a new attribute? thought this prob doesn't break anything
 Nope, I just want to return (len(idx),)

On Fri, Oct 24, 2014 at 12:04 PM, jreback notifications@github.com
wrote:

> I know but you want to return `(5,20)` or something right? (e.g. tuple of length of levels)?
> 
> ## maybe could make a new attribute? thought this prob doesn't break anything
> 
> Reply to this email directly or view it on GitHub:
> https://github.com/pydata/pandas/pull/8609#issuecomment-60434245
 ahh, then this is indeed a missing component. ok, rebase and will put in
 rebased and green
