For `isCheckpointed`: note that `checkpoint()` returns `Unit`, so we don't want to break API compatibility here.

For `isCached`, I am following the implementations of PySpark and Spark here: `cache()` and `persist()` modify some internal states then return the RDD being called itself. I suspect modifying in-place gives better performance, but I am not sure if `cache()/persist()` and `unpersist()` will get called a lot. 

It seems to me the first case mentioned needs modify-in-place; given that we might just accommodate the second case as well.