Refactor recursion out of compute 

Previously we wrote lots of `compute` methods like the following:

```Python
@dispatch(Projection, DataFrame)
def compute(t, df):
    parent = compute(t.parent, df)
    return parent[list(t.columns)]
```

The traversal down the tree was baked into each method.  We extract this bit into an explicit `bottom_up` function and instead write methods like the following:

```Python
@dispatch(Projection, DataFrame)
def compute_one(t, df):
    return df[list(t.columns)]
```
I think this depends on what kind of model we want the user to have in their mind when using blaze. Thinking with the numpy model, one considers "accounts['amount'] < 0" a concrete array, ``arr``['name'] as picking a column, and ``arr``[accounts['amount']  < 0] as filtering items (aka one form of fancy indexing). In that model, exchanging them makes sense, but it's probably not the model we want people to use.