function continueAsync() {
        return lib.syncOrAsync(sequence, arg, finalStep);
    }
syncOrAsync: run a sequence of functions synchronously
as long as its returns are not promises (ie have no .then)
includes one argument arg to send to all functions...
this is mainly just to prevent us having to make wrapper functions
when the only purpose of the wrapper is to reference gd
and a final step to be executed at the end
TODO: if there's an error and everything is sync,
this doesn't happen yet because we want to make sure
that it gets reported