[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
```
to @marmbrus 
I move `joinedRow`, `rightNullRow`, `boundCondition` to the beginning of  `leftOuterIterator`, and ran my benchmark again, the result is : 
```
CSV: 9935 ms
CSV: 6989 ms
CSV: 7045 ms
Current Mem Usage:508094480
```
without move, the result is : 
```
CSV: 10590 ms
CSV: 7022 ms
CSV: 7086 ms
Current Mem Usage:402470616
```
(I don't know why the costs of memory is not around 208145728 in my last test, maybe something related to my laptop environment.)
Apparently, the costs of memory increased 25%, and the speed is almost the same.
Is it acceptable?