feat: add task cache save (#6071)
### Description
Add Rust port of `TaskCache.SaveOutputs`.
As part of this I did do a slight rework of `AsyncCache` to avoid the
need to mutate it on writing to the cache. An alternative would be to
throw a `Mutex` around the reference to the `RunCache`, but that would
require holding a guard across awaits [which tokio recommends
against](https://tokio.rs/tokio/tutorial/shared-state#holding-a-mutexguard-across-an-await).
### Testing Instructions
For the refactors the existing unit tests. For the task cache method,
I'm unsure of the best way to test it other than using it the task
visitor. @NicholasLYang do you have any suggestions for testing the task
cache?
Closes TURBO-1382
---------
Co-authored-by: Chris Olszewski <Chris Olszewski>