Multiple aggregation inflexbility
```
In [7]: tips.groupby('sex').agg({'tip' : {'mean' : 'mean', 'std' : 'std'}, 'size' : 'sum'})
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/wesm/code/pandas/<ipython-input-7-850d34319c48> in <module>()
----> 1 tips.groupby('sex').agg({'tip' : {'mean' : 'mean', 'std' : 'std'}, 'size' : 'sum'})

/home/wesm/code/pandas/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
    278         See docstring for aggregate
    279         """
--> 280         return self.aggregate(func, *args, **kwargs)
    281 
    282     def _iterate_slices(self):

/home/wesm/code/pandas/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   1430                     colg = SeriesGroupBy(obj[col], selection=col,
   1431                                          grouper=self.grouper)
-> 1432                     result[col] = colg.aggregate(agg_how)
   1433                     keys.append(col)
   1434 

/home/wesm/code/pandas/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
   1185 
   1186         if hasattr(func_or_funcs,'__iter__'):
-> 1187             ret = self._aggregate_multiple_funcs(func_or_funcs)
   1188         else:
   1189             cyfunc = _intercept_cython(func_or_funcs)

/home/wesm/code/pandas/pandas/core/groupby.pyc in _aggregate_multiple_funcs(self, arg)
   1216         else:
   1217             # list of functions
-> 1218             columns = [func.__name__ for func in arg]
   1219             arg = zip(columns, arg)
   1220 

AttributeError: 'str' object has no attribute '__name__'

In [8]: tips.groupby('sex').agg({'tip' : {'mean' : 'mean', 'std' : 'std'}, 'size' : ['sum']})
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/wesm/code/pandas/<ipython-input-8-6961866fbf6c> in <module>()
----> 1 tips.groupby('sex').agg({'tip' : {'mean' : 'mean', 'std' : 'std'}, 'size' : ['sum']})

/home/wesm/code/pandas/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
    278         See docstring for aggregate
    279         """
--> 280         return self.aggregate(func, *args, **kwargs)
    281 
    282     def _iterate_slices(self):

/home/wesm/code/pandas/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   1430                     colg = SeriesGroupBy(obj[col], selection=col,
   1431                                          grouper=self.grouper)
-> 1432                     result[col] = colg.aggregate(agg_how)
   1433                     keys.append(col)
   1434 

/home/wesm/code/pandas/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
   1185 
   1186         if hasattr(func_or_funcs,'__iter__'):
-> 1187             ret = self._aggregate_multiple_funcs(func_or_funcs)
   1188         else:
   1189             cyfunc = _intercept_cython(func_or_funcs)

/home/wesm/code/pandas/pandas/core/groupby.pyc in _aggregate_multiple_funcs(self, arg)
   1216         else:
   1217             # list of functions
-> 1218             columns = [func.__name__ for func in arg]
   1219             arg = zip(columns, arg)
   1220 

AttributeError: 'str' object has no attribute '__name__'

In [9]: tips.groupby('sex').agg({'tip' : {'mean' : 'mean', 'std' : 'std'}, 'size' : {'sum' : 'sum'}})
Out[9]: 
             tip            size
             std      mean   sum
sex                             
Female  1.159495  2.833448   214
Male    1.489102  3.089618   413
```
