`io.laminext.fetch` does not guarantee API sync

While the io.laminext.fetch interface is convenient for easily making HTTP requests, it requires manual construction of the HTTP request. While this is most likely fine, as the body itself is shared data, it is potentially possible for the request type or headers to change, rendering the call invalid. Instead, sttp+tapir could be used with the Fetch backend to do the queries similar to how it works in the CLI.

Using this is desirable, but will necessitate creating some nice AirStream wrappers to make it as elegant as the existing calls. We don't need to worry about handling of spurious errors, as the new error recovery in errors can be used to present this to the user.