use DistinctBy when synthetic projections are present
- change Proj to a sealed trait with three case classes
- compile to DistinctBy only when necessary, otherwise Distinct as before
- merge Project on left or right with source equal to the other worflowop
respond to PR feedback

Remove Proj.Synthetic; instead, annotated the introduced projections with a
Synthetic annotation. Lots of ensuing fallout, resulting in slightly easier
to read composition of AST analyses.

Some minor cleanup.
go back to standard Arrow nomenclature (first, second)
Merge pull request #363 from mossprescott/ready/distinct-by

Implement DistinctBy