[SPARK-2010] Support for nested data in PySpark SQL

Nested collections are supported, which include array, dict, list, set, and tuple.
I haven't looked too deeply, my initial understanding is that Structs are for user-defined Objects (if we are going to support them in Python), while MapType should suffice if we access dictionaries only as maps. Specifically, 

1) Struct stores its fields in order, which makes it usable as schema for the outermost dict, as we need to match schema with data stored in an array for each row. Speaking of ordering, how can we be sure when we map dictionary values to an array, they are all in the same order? 
```
    val rowRdd = rdd.mapPartitions { iter =>
      iter.map { map =>
        new GenericRow(map.values.toArray.asInstanceOf[Array[Any]]): Row
      }
    }
```  

2) Structs can only be used for dicts when the keys are Strings, right?

3) I don't know enough about access pattern to tell if it is safe to label Set as ArrayType since Set is unordered?