Return Graph from Graph.aggregateNeighbors

Graph.aggregateNeighbors applies an associative, commutative operation to the neighborhood of each vertex and associates the result (of type `A`) with that vertex. It used to return an RDD associating each vertex's ID with its result (i.e., `RDD[(Vid, A)]`). If there was no result for a vertex, its entry was omitted from the RDD.

This pull request makes aggregateNeighbors return a graph isomorphic to the original graph, but with augmented vertex values (i.e., `Graph[(VD, Option[A]), ED]`), and updates all callers of aggregateNeighbors to use the new API.