Use more efficient underlying data structures for blocks

Previously we were still linearly traversing all the blocks held
by each storage status. Now we index by the RDD ID and return only
the blocks of interest to us.
Add extensive tests for new code in StorageStatus

This tests just about every single method in StorageStatus. In
addition, a few methods in StorageStatus are changed to return
Map instead of Seq. This commit also adds a few comments indicating
that StorageStatus#blocks is expensive and there are cheaper
alternatives.