[SPARK-2042] Prevent unnecessary shuffle triggered by take()

This PR implements `take()` on a `SchemaRDD` by inserting a logical limit that is followed by a `collect()`. This is also accompanied by adding a catalyst optimizer rule for collapsing adjacent limits. Doing so prevents an unnecessary shuffle that is sometimes triggered by `take()`.
maybe you can delegate to limit? 

btw it is strange to me that limit takes an Expression. I can understand why, but I can't see why on earth somebody would want to build a spark sql expression to give a limit, if he could just give it an integer (or some scala expression).