[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 somthing in another issue.
`DUMMY_LIST.fitler` was for easy understanding, now it will be called more times that before, probably will be the new performance bottleneck, I can understand if we leave that for further improvement.