[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()`.
Yeah, having an `Expression` internally is nice for consistency, but I don't see a good reason for the user facing `limit` in SchemaRDD to take an `Expression` instead of an `Int`.