Optimization to insert Projections

Fixes https://github.com/ContinuumIO/blaze/issues/668

```Python
In [1]: from blaze import *

In [2]: s = Symbol('s', 'var * {x: int, y: int, z: int, w: int}')

In [3]: by(s.x, s.y.sum())
Out[3]: By(grouper=s['x'], apply=sum(_child=s['y'], axis=None))

In [4]: from blaze.expr.optimize import lean_projection 

In [5]: lean_projection(by(s.x, s.y.sum()))
Out[5]: By(grouper=s[['x', 'y']]['x'], apply=sum(_child=s[['x', 'y']]['y'], axis=None))

In [6]: lean_projection(by(s.x, s.y.sum()))._child
Out[6]: s[['x', 'y']]
```

I'm not at all confident that this is the right approach.  cc @cpcloud 
`Parameters`