[SPARK-3247][SQL] An API for adding data sources to Spark SQL

**Work in progress - APIs may change**

This PR introduces a new set of APIs to Spark SQL to allow other developers to add support for reading data from new sources in `org.apache.spark.sql.sources`.

New sources must implement the interface `BaseRelation`, which is responsible for describing the schema of the data.  This base relation must also implement at least one `Scan` interface, which is responsible for producing an RDD containing row objects.  The [various Scan interfaces](https://github.com/marmbrus/spark/blob/foreign/sql/core/src/main/scala/org/apache/spark/sql/sources/package.scala#L50) allow for optimizations such as column pruning and filter push down, when the underlying data source can handle these operations.

By implementing a class that inherits from RelationProvider these data sources can be accessed using using pure SQL.  I've used the functionality to update the JSON support so it can now be used in this way as follows:

```sql
CREATE TEMPORARY TABLE jsonTableSQL
USING org.apache.spark.sql.json
OPTIONS (
  fileName '/home/michael/data.json'
)
```

Further example usage can be found in the test cases: https://github.com/marmbrus/spark/tree/foreign/sql/core/src/test/scala/org/apache/spark/sql/sources

There is also a library that uses this new API to read avro data available here:
https://github.com/marmbrus/sql-avro

I think we need to add some logics to generate error messages for invalid DDL statements in future.
Right now, if a user writes an invalid DDL statement, the error message will be generated and thrown by the SQL parser. For example, for the following invalid DDL statement,
```
CREATE TEMPORARY TABLE jsonTableSQL
USING org.apache.spark.sql.json
a string causing parsing error
OPTIONS (
  fileName '/home/michael/data.json'
)
```
the error message is 
```
java.lang.RuntimeException: [2.1] failure: ``INSERT'' expected but identifier create found
```