Coerce works on Spark RDDs

This allows us to effectively coerce types on data stored in RDDs.  We've changed `coerce` to be another magical multiply dispatched function.

```Python
>>> rdd = sc.parallelize([('1', 'hello'), ('2', 'world')])
>>> coerce('{x: int, y: string}', rdd).collect()
[(1L, u'hello'), (2L, u'world')]
```

@quasiben
@quasiben does this look ok to you?