Understanding intricacy of async/await (memory safety) - C#