Not using `Source` is intentional. See the PR/commit message.

> Didn't use scala.io.Source because it doesn't really support reading binary data and because it looks slow, which wouldn't be great for some use cases, e.g. reading assets or when a user uses Files.readFile.

`Source` decodes everything with a `CharsetDecoder` into an `Iterator[Char]`. That means `Source` is not suited for use with binary data or in situations where performance matters. If we knew we were only use `Source` for smallish amounts of text data or only in code where performance didn't matter then that would be fine. But there are a couple of cases where that's not true:

* `readFileAsString` is exposed to the user via `Files.readFile` so it might be called in performance-sensitive code by the user.
* `readFile` is called from asset code so it needs to handle both binary data and also be fast.

If we need `readFile` and `readFileAsString` anyway, then the overhead to include `readUrlAsString` in the is small, and we may as well keep it, especially since it's a slightly faster way of doing things than `Source.fromUrl(_).mkString`.