spawn! : Input(msg), (() => msg) => {}
Start a task. Its message arrives on a later Input.messages, in the
order the tasks finished.
Pass the current App.Input as the first argument. It pins the closure's
return type to the app's Msg; it is not otherwise read.
A task closure may capture the input, so a task can spawn more tasks.
The task may start before spawn! returns or after update!; it reaches
its first wait or finishes before that cycle's render!. Do not assume
ordering between its synchronous work and the spawning update!.
Messages are delivered in task-completion order.
When more than one task of the same kind can be running, an older reply
can arrive after a newer one. Put a generation counter or id in the message
and drop replies that do not match the latest; examples/http_fetch
shows the shape.
This is the only way to start a task. Input is a pure platform value
with no effectful methods, so there is no
input.spawn! form.
Legal in update! and in tasks; refused in init! and render!. init!
never sees an input for the message to arrive on, and render! does not
change the world.