code: def split(nodeShape, jobShape, wallTime):
      
      return (Shape(wallTime,
                    nodeShape.memory - jobShape.memory,
                    nodeShape.cores - jobShape.cores,
                    nodeShape.disk - jobShape.disk,
                    nodeShape.preemptable),
              NodeReservation(Shape(nodeShape.wallTime - wallTime,
                                    nodeShape.memory,
                                    nodeShape.cores,
                                    nodeShape.disk,
                                    nodeShape.preemptable)))
docs: Partition a node allocation into two to fit the job, returning the
      modified shape of the node and a new node reservation for
      the extra time that the job didn't fill.