How does the async-await pattern work under the hood in .NET Core, and how does it impact thread pool utilization at NDA?