Introduce SparkBuildManager to maintain build cache:

SparkBuildManager maintains a cache of binary Spark distributions,
indexed by their SHAs. This makes it much faster to test against
multiple Spark versions because we don’t have to completely re-build
Spark for each test run.

I removed the SPARK_SKIP_PREP configuration option, since it’s not very
useful anymore: if we’re running multiple tests against the same Spark
version, we’ll just use the cached build.

This commit part of the groundwork for automated testing against
multiple Spark versions.