runner = function() {
    functions[i]().then(function(result) {
      results[i] = result;
      if (i < functions.length - 1) {
        i++;
        runner();
      } else {
        resolver.resolve();
      }
    }, function(e) {
      resolver.reject(e);
    });
  }
Executes a list of asynchronous functions in a serial manner, such that only
one function is being executed at any given time.
@param {!Array<!function():!IThenable>} functions The functions to be
    executed.
@return {!IThenable} A deferred holding the results of each executed function
    in the same order.