Overview of changes:
* cached() will not always create cache
Turns out caching *any* result is not the best approach as it means
failures will keep manifesting in cache. New version solves this by
caching only if exit status is zero. This can be overrided per
call.