[OPTIQ-371] Implement JOIN whose ON clause contains mixed equi and theta

Add class EnumerableSemiJoin and EnumerableSemiJoinRule.

Add test cases for EXISTS and NOT EXISTS.

Add Enumerables.semiJoin, which will eventually go into linq4j.

Change the constructor of SemiJoinRel to allow it to be sub-classed.