Join docstring
WIP add subs
correct subs, add tests
Column is now just a projection

ColumnWise no longer inherits from Column

Columns have full record schema

use isidentical or str comparison instead of ==
By uses subs to redirect computations onto parent
by: fix test name
standardize expr/core
expr: pep8
pep8
fix docstring imports in pandas, sql
normalize pandas join columns

squashme
add unique utility function
sql: Join returns a select to specify columns
Projection of Join

We added a stronger test that did a Join, then a Projection.
This stressed both the computation system and the expr system, leading to the
following changes:

1.  Demonstrated how to use compute(..., dict) with non-Joins, see

    @dispatch(Projection, dict)

    in core

2.  SQLAlchemy compute dispatches on Selectable, not Table

3.  SQL Join uses select and unique to shrink down the columns so that
    they match the schema.

    Previously the column names were like

        table1.a, table1.b, table2.a, table2.c

    Now the column names are like

        a, b, c

4.  This also forced the ``unique`` contribution to utils in the last commit
also broadcast down on By operation
add @talumbau 's test for arcs
Pandas Join re-aligns columns
redefine __hash__ in classes that redefine __eq__
wrap dict.values call with list to support py3
compute(..., dict) tries recursing against parent