Pure HTTP client, based on effect

This was extracted from my heat-reauth branch.

It adds a new HTTP client function, otter.util.pure_http.request, which returns an Effect and has a lot of built-in convenience.
Could this status code maybe be provided in an optional argument?  I'm wondering if we should also include 403's (which are also permission errors), but in particular we've encountered issues were 500 were possibly also caused by an auth problem in certain cases  :|