Allow user to choose a partitioner at runtime

This adds a `PartitionStrategy` trait that determines how edges are assigned to partitions. This allows the user to specify a partitioning strategy when creating a `GraphImpl` object. I also added a command line flag to pagerank so the user can specify a partitioning strategy at runtime.