[SPARK-4759] Fix driver hanging from coalescing partitions

The driver hangs sometimes when we coalesce RDD partitions. See JIRA for more details and reproduction.

This is because our use of empty string as default preferred location in `CoalescedRDDPartition` causes the `TaskSetManager` to schedule the corresponding task on host `""` (empty string). The intended semantics here, however, is that the partition does not have a preferred location, and the TSM should schedule the corresponding task accordingly.
Maybe this is outside the scope of what you want to do in this PR, but this statement seems a little dense and hard to read, so it might be nice to refactor it a bit.

Here's what we have now, as of this PR:

```scala
    val loc = parents.count { p =>
      preferredLocation.exists { l =>
        rdd.context.getPreferredLocs(rdd, p.index).map(_.host).contains(l)
      }
    }
```

The idea here seems to be something like "calculate the number of parents whose partitions can be computed at the given `preferredLocation`.  I think it might be clearer / more efficient to hoist the `rdd.context.getPreferredLocs(rdd, p.index).map(_host)` out of the inner `exists` loop:

```scala
    val loc = parents.count { p =>
      val parentPreferredLocations = rdd.context.getPreferredLocs(rdd, p.index).map(_.host)
      preferredLocation.exists(parentPreferredLocations.contains)
    }
```

This seems clearer to me, since I think that the last line reads more clearly as "true if one of the parent's preferred locations is `preferredLocation`."

It might also be nice to rename `loc` to something more descriptive, such as `localParents`.