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

Add `metadata` to `StructField`, which is a map that can store information about the column. The metadata is preserved through simple operations like `SELECT`. This PR doesn't handle Ser/De of schema.

Questions:
1. Should we use a mutable map or immutable map for metadata?
2. I put the tests in `SQLQuerySuite`. Is it the right place?

@marmbrus @liancheng
I'm not sure if we need to override here. The CaseClassStringParser is only for reading legacy parquet files.  I think it is okay if old version of spark don't handle types exactly when reading data written by new versions.