[SPARK-4483][SQL]Optimization about reduce memory costs during the HashOuterJoin

In `HashOuterJoin.scala`, spark read data from both side of join operation before zip them together. It is a waste for memory. We are trying to read data from only one side, put them into a hashmap, and then generate the `JoinedRow` with data from other side one by one.
Currently, we could only do this optimization for `left outer join` and `right outer join`. For `full outer join`, we will do something in another issue.

for 
table test_csv contains 1 million records
table dim_csv contains 10 thousand records

SQL:
`select * from test_csv a left outer join dim_csv b on a.key = b.key`

the result is:
master:
```
CSV: 12671 ms
CSV: 9021 ms
CSV: 9200 ms
Current Mem Usage:787788984
```
after patch：
```
CSV: 10382 ms
CSV: 7543 ms
CSV: 7469 ms
Current Mem Usage:208145728
```
Hi, @marmbrus 
I have tested these codes in following way:
1 Added the following codes in `leftOuterIterator` before return the iterator
```
System.out.println("["+Thread.currentThread().getName+"]The hashcode of joinedRow = ["+ System.identityHashCode(joinedRow) +"]");
```

2 I started a thriftserver with `-Dspark.master=local[4]` properties to make sure there are 4 tasks running in the same JVM.

3 Then I run a sql like (same table and data with my benchmark test):
```
select count(1) from test_csv a left outer join dim_csv b on a.key = b.key;
```

4 I got the following logs:
```
[Executor task launch worker-0]The hashcode of joinedRow = [155362507]
[Executor task launch worker-1]The hashcode of joinedRow = [2032520348]
[Executor task launch worker-2]The hashcode of joinedRow = [1382003837]
[Executor task launch worker-3]The hashcode of joinedRow = [459410904]
[Executor task launch worker-2]The hashcode of joinedRow = [1382003837]
[Executor task launch worker-1]The hashcode of joinedRow = [2032520348]
[Executor task launch worker-0]The hashcode of joinedRow = [155362507]
[Executor task launch worker-1]The hashcode of joinedRow = [2032520348]
[Executor task launch worker-2]The hashcode of joinedRow = [1382003837]
[Executor task launch worker-3]The hashcode of joinedRow = [459410904]
```

I think that proved the codes should working fine under mutible tasks running in the same JVM.