[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

This used to be strict and let you select the filters you could handle, but then Reynold and I decided to simplify it.  It's pretty hard to design an interface that allows you to handle all three cases cleanly:
 - Supported filters
 - Unsupported filters
 - Advisory filters (used to optimize but not guaranteed to be evaluated)

Since filter evaluation is pretty cheap (we double evaluate filters pushed down to parquet now) we decided to do this.

What were you thinking the semantics of isStrict would be?  Do we still pass them all down?

```scala
/** Returns true if all filters can be handled by the base source */
def isStrict(filters: Seq[Expression]): Boolean
```