Creating Asynchronous Applications with Virtual Threads