[rust][fasync] Prepare for the removal of fasync::spawn*

TLDR: fasync::spawn functions are going away in preference of the new
Task::spawn API's. This CL prepares the way by replacing usage of the old
API's with usage of the new one.

We're deprecating and replacing the old spawn functions (spawn, spawn_local,
spawn_blocking) and replacing them with an API centered around Task objects.

Tasks own the execution of the underlying future, and if dropped will cancel
that execution. To regain the old, unowned execution that spawn API's offered
a detach method is offered.

This change series sweeps through the codebase and replaces spawn() with
Task::spawn().detach() and spawn_local() with Task::local().detach() in
preparation for the removal of the original API's.

It's hoped that code maintainers will then take the opportunity (when it makes
sense for them to do so) to move to a model where Tasks are not detached but
owned for as long as they need to be running.

Change-Id: I7de6b80034a3426d69bbf38a9edbca62ca0319de
Reviewed-on: https://fuchsia-review.googlesource.com/c/experiences/+/410914
Testability-Review: Craig Tiller <ctiller@google.com>
Testability-Review: Chase Latta <chaselatta@google.com>
Reviewed-by: Chase Latta <chaselatta@google.com>
Reviewed-by: Kevin Lindkvist <lindkvist@google.com>
Commit-Queue: Craig Tiller <ctiller@google.com>
diff --git a/session_shells/ermine/session/src/element_repository/element_manager_server.rs b/session_shells/ermine/session/src/element_repository/element_manager_server.rs
index 4e21fa0..c4a23d7 100644
--- a/session_shells/ermine/session/src/element_repository/element_manager_server.rs
+++ b/session_shells/ermine/session/src/element_repository/element_manager_server.rs
@@ -97,10 +97,11 @@
 
         let spec =
             ElementSpec { component_url: Some("foo".to_string()), ..ElementSpec::new_empty() };
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             let _ = proxy.propose_element(spec, None).await;
             drop(proxy);
-        });
+        })
+        .detach();
         let _ = server.handle_request(stream).await;
 
         match wait_for_first_event_or_timeout(&mut receiver).await {
@@ -120,12 +121,13 @@
 
         let spec =
             ElementSpec { component_url: Some("foo".to_string()), ..ElementSpec::new_empty() };
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             let (_controller_proxy, server_end) =
                 create_proxy::<ElementControllerMarker>().expect("failed to create endpoints");
             let _ = proxy.propose_element(spec, Some(server_end)).await;
             drop(proxy);
-        });
+        })
+        .detach();
         let _ = server.handle_request(stream).await;
 
         match wait_for_first_event_or_timeout(&mut receiver).await {
diff --git a/session_shells/ermine/session/src/element_repository/event_handler.rs b/session_shells/ermine/session/src/element_repository/event_handler.rs
index 8a90b17..20df0b2 100644
--- a/session_shells/ermine/session/src/element_repository/event_handler.rs
+++ b/session_shells/ermine/session/src/element_repository/event_handler.rs
@@ -84,9 +84,10 @@
 
         // Hold the element in the spawn_local here. when the call closes all
         // of the proxies will be closed.
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             run_until_closed(element, stream, view_controller_proxy).await;
-        });
+        })
+        .detach();
     }
 }
 
@@ -332,7 +333,7 @@
         // tell the view controller to dismiss. The view controller then can
         // decide how it wants to dismiss the view. When it is done presenting
         // the view it closes the channel to indicate it is done presenting.
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             let mut vc_stream = vc_server_end.into_stream().unwrap();
             while let Ok(Some(request)) = vc_stream.try_next().await {
                 match request {
@@ -342,7 +343,8 @@
                     _ => (),
                 }
             }
-        });
+        })
+        .detach();
 
         expect_element_wait_fut_completion!(element_wait_fut);
     }
@@ -370,9 +372,10 @@
         let element = Rc::new(RefCell::new(element));
 
         let element_clone = element.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             spawn_element_controller_stream(element_clone, Some(element_stream), None).await;
-        });
+        })
+        .detach();
 
         let new_annotations = Annotations {
             custom_annotations: Some(vec![Annotation {
@@ -402,12 +405,13 @@
         let element = Rc::new(RefCell::new(element));
 
         let element_clone = element.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             spawn_element_controller_stream(element_clone, Some(element_stream), Some(vc_proxy))
                 .await;
-        });
+        })
+        .detach();
 
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             let new_annotations = Annotations {
                 custom_annotations: Some(vec![Annotation {
                     key: "foo".to_string(),
@@ -415,7 +419,8 @@
                 }]),
             };
             let _ = element_controller.set_annotations(new_annotations).await;
-        });
+        })
+        .detach();
 
         let mut got_annotation = false;
         if let Ok(Some(request)) = view_controller_stream.try_next().await {
@@ -455,9 +460,10 @@
         }
 
         let element_clone = element.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             spawn_element_controller_stream(element_clone, Some(element_stream), None).await;
-        });
+        })
+        .detach();
 
         let mut got_annotation = false;
         if let Ok(Ok(annotations)) = element_controller.get_annotations().await {
diff --git a/session_shells/ermine/session/src/element_repository/mod.rs b/session_shells/ermine/session/src/element_repository/mod.rs
index 729845c..e8fa9b5 100644
--- a/session_shells/ermine/session/src/element_repository/mod.rs
+++ b/session_shells/ermine/session/src/element_repository/mod.rs
@@ -188,9 +188,10 @@
         let mut handler = CallCountEventHandler::default();
 
         let sender = repo.sender.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             sender.unbounded_send(ElementEvent::Shutdown).expect("failed to send event");
-        });
+        })
+        .detach();
 
         repo.run_with_handler(&mut handler).await?;
         assert_eq!(handler.shutdown_call_count, 1);
@@ -205,7 +206,7 @@
 
         let (element, _channel) = make_mock_element();
         let sender = repo.sender.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             sender
                 .unbounded_send(ElementEvent::ElementAdded {
                     element,
@@ -215,7 +216,8 @@
 
             // need to shut down the handler
             sender.unbounded_send(ElementEvent::Shutdown).expect("failed to send event");
-        });
+        })
+        .detach();
 
         repo.run_with_handler(&mut handler).await?;
         assert_eq!(handler.add_call_count, 1);
diff --git a/session_shells/ermine/session/src/pointer_hack_server.rs b/session_shells/ermine/session/src/pointer_hack_server.rs
index 5882366..7d681ea 100644
--- a/session_shells/ermine/session/src/pointer_hack_server.rs
+++ b/session_shells/ermine/session/src/pointer_hack_server.rs
@@ -32,9 +32,10 @@
     ) -> PointerHackServer {
         let server = PointerHackServer { pointer_listeners: Arc::new(Mutex::new(vec![])) };
         let pointer_listeners = server.pointer_listeners.clone();
-        fasync::spawn_local(async move {
+        fasync::Task::local(async move {
             PointerHackServer::serve(server_chan, pointer_listeners, element_server).await;
-        });
+        })
+        .detach();
         server
     }
 
diff --git a/session_shells/ermine/session/src/workstation_input_pipeline.rs b/session_shells/ermine/session/src/workstation_input_pipeline.rs
index ebc484c..cbda697 100644
--- a/session_shells/ermine/session/src/workstation_input_pipeline.rs
+++ b/session_shells/ermine/session/src/workstation_input_pipeline.rs
@@ -108,13 +108,14 @@
     );
     handlers.push(Box::new(mouse_handler));
 
-    fasync::spawn(async move {
+    fasync::Task::spawn(async move {
         while let Some(Position { x, y }) = receiver.next().await {
             let screen_coordinates =
                 ScreenCoordinates::from_pixels(x, y, scene_manager.display_metrics);
             scene_manager.set_cursor_location(screen_coordinates);
         }
-    });
+    })
+    .detach();
 }
 
 async fn add_mouse_hack(