Implementing the retry pattern for async tasks in c#