Fix bug in outer joins w/ multiple predicates.

In the previous coding, we only used the first join predicate to probe the
join's hash table; the rest of the predicates were checked manually
(`test_locals`). The outer join code incorrectly assumed that finding a match on
the hash table probe was equivalent to finding a matching tuple for a given join
input.

To fix this, we could apply `test_locals` in the outer join code. However, the
previous coding also imposes a performance penalty on join operators with
multiple predicates. So instead, check all the join predicates by probing the
hash table.

One consequence is that the keys of the join hash table are now arrays, rather
than scalar values. This results in a ~10% slowdown for a join microbenchmark
(test/perf/join_bench.rb), which just does a ton of hash table probes. I'll look
into addressing that shortly.

Fixes #315.
Tweak notin perf.
Tweak join perf.

Avoid a conditional branch in a fast path.
Another join perf tweak.