Implement custom JS resolvers in GraphQL

Had a bunch of calls with @pawan and @mrjn.

I think we might tweak the way the javascript is written, and try to look a little bit more like a webworker, so that we can make use of existing tools like webpack to include libraries.

A simple Javascript will look like this:

async getVirtualName({parent, graphql, args}) {
  const [arg1, arg2] = args;
  const data1 = await fetch(`https://external-data.com/some-data/${parent.id}`);
  const data2 = await graphql(`query { foo { bar } }`);
  return {...data1, ...data2 }
}

self.addEventListener("Query.getFullName", event => event.respondWith(getFullName(event)))
self.addEventListener("Mutation.updateName", event => event.respondWith(getFullName(event)))
self.addEventListener("User.virtualName", event => event.respondWith(getVirtualName(event)))

Alternatively, we can provide a function to get rid of the boiler plate at the end, but typescript will complain a bit

self.addGraphQLResolvers({
  "Query.getFullName": getFullName,
  "Mutation.updateName": updateName,
  "User.virtualName": virtualName,
})