launch: Add ScriptLauncher

ScriptLauncher collects all commands from a process group, and writes
them to a JSON file, after which a script is called with the JSON file's
path and the max_concurrency as arguments.

This easily supports more environment specific submission schemes,
without having to create a new Launcher every time.