Instead of caching all failures in engine we cache them in storage,
which is cleaner and more transparent.
Behavior change: if task failed, then flow was suspended, then
loaded again but without task with such name, such flow would be
reverted now in engine.run(). Previously, such flow could be run
normally as all data from not present tasks were ignored.
Closes-bug: #1251736
Change-Id: I64e99ca98cc7fd28957ac2468577d677641aebdc