[SPARK-4763] All-pairs shortest paths algorithm for GraphX

Computes unweighted all-pairs shortest paths, returning an RDD containing the shortest-path distance between all pairs of reachable vertices. The algorithm is similar to distance-vector routing and runs in `O(|V|)` iterations.
We merged a simpler fix for graph checkpointing in https://issues.apache.org/jira/browse/SPARK-4672. I think this fixes SPARK-3623 -- are the extra changes to Spark core in your PR necessary?