compute: projection of data descriptor uses `.py`
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.

cpcloud/blaze,nkhuyu/blaze,LiaoPan/blaze,nkhuyu/blaze,dwillmer/blaze,ChinaQuants/blaze,scls19fr/blaze,ContinuumIO/blaze,alexmojaki/blaze,jcrist/blaze,cowlicks/blaze,caseyclements/blaze,dwillmer/blaze,alexmojaki/blaze,maxalbert/blaze,ChinaQuants/blaze,caseyclements/blaze,mrocklin/blaze,jdmcbr/blaze,jcrist/blaze,jdmcbr/blaze,maxalbert/blaze,ContinuumIO/blaze,scls19fr/blaze,xlhtc007/blaze,mrocklin/blaze,xlhtc007/blaze,cowlicks/blaze,cpcloud/blaze,LiaoPan/blaze