Instead of inferring error sets with `!`, each function that can fail should use a specific error set or error set union