[SPARK-2010] [PySpark] [SQL] support nested structure in SchemaRDD (part 1)

Convert Row in JavaSchemaRDD into Array[Any] and unpickle them as tuple in Python, then convert them into namedtuple, so use can access fields just like attributes.

This will let nested structure can be accessed as object, also it will reduce the size of serialized data and better performance.

root
 |-- field1: integer (nullable = true)
 |-- field2: string (nullable = true)
 |-- field3: struct (nullable = true)
 |    |-- field4: integer (nullable = true)
 |    |-- field5: array (nullable = true)
 |    |    |-- element: integer (containsNull = false)
 |-- field6: array (nullable = true)
 |    |-- element: struct (containsNull = false)
 |    |    |-- field7: string (nullable = true)

Then we can access them by row.field3.field5[0]  or row.field6[5].field7

On the Python side, I'd skip this field if the name starts with `__` and ends with `__`. This should be enough to cover the Python reserved methods without us having to create a list. Separately, in this code, we can rename the local variables to `__i__` and `__f__`, or maybe you can move this code into a def() and call that so they're local variables.