[SPARK-3573][MLLIB] Make MLlib's Vector compatible with SQL's SchemaRDD

Register MLlib's Vector as a SQL user-defined type (UDT) in both Scala and Python. With this PR, we can easily map a RDD[LabeledPoint] to a SchemaRDD, and then select columns or save to a Parquet file. Examples in Scala/Python are attached. The Scala code was copied from @jkbradley.

~~This PR contains the changes from #3068 . I will rebase after #3068 is merged.~~

@marmbrus @jkbradley
`dataset.printSchema()` doesn't output json, which contains more information:

~~~
{
  "type" : "struct",
  "fields" : [ {
    "name" : "label",
    "type" : "double",
    "nullable" : false,
    "metadata" : { }
  }, {
    "name" : "features",
    "type" : {
      "type" : "udt",
      "class" : "org.apache.spark.mllib.linalg.VectorUDT",
      "pyClass" : "pyspark.mllib.linalg.VectorUDT",
      "sqlType" : {
        "type" : "struct",
        "fields" : [ {
          "name" : "type",
          "type" : "byte",
          "nullable" : false,
          "metadata" : { }
        }, {
          "name" : "size",
          "type" : "integer",
          "nullable" : true,
          "metadata" : { }
        }, {
          "name" : "indices",
          "type" : {
            "type" : "array",
            "elementType" : "integer",
            "containsNull" : false
          },
          "nullable" : true,
          "metadata" : { }
        }, {
          "name" : "values",
          "type" : {
            "type" : "array",
            "elementType" : "double",
            "containsNull" : false
          },
          "nullable" : true,
          "metadata" : { }
        } ]
      }
    },
    "nullable" : true,
    "metadata" : { }
  } ]
}
~~~