[SPARK-4387][PySpark] Refactoring python profiling code to make it extensible

This is a refactor of the [profiling feature](https://github.com/apache/spark/commit/c5414b681868a0a11cc5a94184116e66e8d3e9c0) done by @davies 

This will allow us to hook in custom profilers and output sinks more easily. 
I think it makes sense to keep the `_profile_stats` in the context since it needs to know about all of the stages. But you're right we can simplify the API for profilers. I'll do that.