compute: projection of data descriptor uses `.py`

Previously we used to iterate over the descriptor

    @dispatch(Expr, DataDescriptor)
    def compute_one(t, ddesc, **kwargs):
        return compute_one(t, iter(ddesc))  # use Python streaming by default

Now if the top node is a projection we can select out the right columns

    @dispatch(Projection, DataDescriptor)
    def compute_one(t, ddesc, **kwargs):
        return ddesc.py[:, t.columns]

Because most `.py` systems can remove a few columns more efficiently than many
columns this has great performance improvements.  E.g. column stores are now
active and CSV files don't need to deserialize everything.