[SPARK-3569][SQL] Add metadata field to StructField

Add `metadata: Metadata` to `StructField` to store extra information of columns. `Metadata` is a simple wrapper over `Map[String, Any]` with value types restricted to Boolean, Long, Double, String, Metadata, and arrays of those types. SerDe is via JSON.

Metadata is preserved through simple operations like `SELECT`.

@marmbrus @liancheng
Use {} as default value will have side effects, such as:
```
>>> a = StructField('a', StringType(), True)
>>> b = StructField('b', StringType(), True)
>>> a.metadata['name'] = 'a'
>>> b.metadata['name']
'a'
```

So if the meta could be modified somewhere, here you should use `None` as default value.
```
def xxx(xxx, metadata=None):
    .... 
    self.metadata = metadata or {}
```