IMPALA-1118: Retain join predicates that reference a slot of an outer-joined tuple.

The bug: When gathering join predicates, we eliminate redundant ones based on
equivalence classes. However, predicates that reference an outer-joined tuple cannot
be safely removed even if the corresponding equivalence class is already covered by
another predicate because such predicates could imply 'slot IS NOT NULL' and removing
them would allow NULL tuples from outer joins to be incorrectly returned.

The fix: Retain otherwise redundant predicates if they reference a slot of an
outer-joined tuple to maintain that the output of a join satisfies 'slot IS NOT NULL'
(otherwise NULL tuples from preceding outer joins could incorrectly survive).
For each outer-joined slot we only need to retain a single predicate.
TODO: Consider better fixes for outer-joined slots: (1) Create IS NOT NULL
predicates and place them at the lowest possible plan node. (2) Convert outer
joins into inner joins (or full outer joins into left/right outer joins).

Change-Id: Ie4dc20c1db3f3822d4b60e5dfbc00c024a1d3db7
Reviewed-on: http://gerrit.sjc.cloudera.com:8080/4485
Reviewed-by: Alex Behm <alex.behm@cloudera.com>
Tested-by: jenkins