[SPARK-4226][SQL] SparkSQL - Add support for subqueries in predicates('in' clause)

This PR supports subqueries in preicates 'in' clause. The queries will be transformed to the LeftSemi join as mentioned below.

Case 1 Uncorelated queries

-- original query
select C
from R1
where R1.A in (Select B from R2)
-- rewritten query
Select C
from R1 left semijoin R2 on R1.A = R2.B

Case 2 Corelated queries

-- original query
select C
from R1
where R1.A in (Select B from R2 where R1.X = R2.Y)
-- rewritten query
select C
from R1 left semi join
(select B, R2.Y as sq1_col0 from R2) sq1
on R1.X = sq1.sq1_col0 and R1.A = sq1.B

Restriction : Alias need to be used as we convert it into join queries.
Complete specification is available in https://issues.apache.org/jira/secure/attachment/12614003/SubQuerySpec.pdf
A few things here
 - I'd add the guard above so we don't have to resolve here.  Hand resolution like you are doing here will work for simple cases but doesn't run to fixed point.
 - Never compare attributes by name, and don't inspect the project list to see what the output will be.  The reasons are as follows: names can be ambiguous and the project list could have aliases and other things that confuse the inspection.  Instead use `outputSet` which returns an `AttributeSet` that does comparisons correctly.
 - if you need multi line lambas, prefer the following syntax:
```  
  list.filter { a =>
    a....
  }
```

All together I think you want something like:
```scala
f.references.filterNot(project.outputSet.contains)
```