It would be awesome if async/await reduced code complexity instead of just hiding it. But when complexity is unavoidable, we have to make it manageable.
Dynamic languages have good generic forms of memoization, but I haven't found one I'm happy with in C#. This is a sketch of a generic memoization in C#.
Every software development environment has its bright points, and C# is no exception. The following are a few features and tools we enjoyed working with.
If you have had any trouble figuring out how to test your presenter classes (or any classes that respond to events), I recommend trying this technique.