Managing errors across a complex asynchronous workflow