Designing asynchronous code