Adds two-class scheduling (for GPUs and CPUs) to the scheduler policy.
Enables batching on the executor side -- if a request is marked as batching-capable, we dequeue multiple schedules and multiple DAG triggers and pass in lists of objects instead of individual objects. Most of the changes in this PR are around rewriting the executor stack to accept more than one function execution at a time.
Adds new Dockerfiles for GPU-enabled Cloudburst executors with CUDA support. Those Dockerfiles required moving to Ubuntu 18.04, which also required changing the way we pick out node IPs.