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)]
```
My recollection is that it was 'skipped' in the sense that Spark tests were skipped but when Spark tests were run, it should run and pass, since it was basically capturing the functionality needed to do the jaccard work. I will discover whether it is broken. I'm inclined to keep it if it works and I can  have a go at fixing it if it doesn't.