GraphQL Client

Query a GraphQL API with variables and store the result, with the error handling GraphQL actually needs: a failed query returns HTTP 200 with an errors array, so a status check alone silently stores nulls. Asserts on body.errors before writing, and keeps values in variables rather than interpolating into the query text.