track task completion in DAGScheduler, and send a stageCompleted event with taskInfo to SparkListeners
simple util to summarize distributions
can get task runtime summary from task info
expose stageInfo in SparkContext
convenient name available in StageInfo
Merge branch 'master' into stageInfo

Conflicts:
	core/src/main/scala/spark/scheduler/DAGScheduler.scala
	core/src/main/scala/spark/scheduler/local/LocalScheduler.scala
track total bytes written by ShuffleMapTasks
add TimedIterator
Shuffle Fetchers use a timed iterator
task context keeps a handle on Task -- giant hack, temporary for tracking shuffle times & amount
cogrouped RDD stores the amount of time taken to read shuffle data in each task
BlockManager.getMultiple returns a custom iterator, to enable tracking of shuffle performance
track remoteFetchTime
add as many fetch requests as we can, subject to maxBytesInFlight
setup plumbing to get task metrics; lots of unfinished parts, but basic flow in place
general fixes to Distribution, plus some tests
Use stubs instead of mocks for DAGSchedulerSuite.
Change defaultPartitioner to use upstream split size.

Previously it used the SparkContext.defaultParallelism, which occassionally
ended up being a very bad guess. Looking at upstream RDDs seems to make
better use of the context.

Also sorted the upstream RDDs by partition size first, as if we have
a hugely-partitioned RDD and tiny-partitioned RDD, it is unlikely
we want the resulting RDD to be tiny-partitioned.
use TaskMetrics to gather all stats; lots of plumbing to get it all the way back to driver
SparkContext.addSparkListener; "std" listener in StatsReportListener