[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
This is easy for Java users and mirroring the API for Python. Array of primitive types is also more memory-efficient that Seq.