function Promise(handler) {
    if (!(this instanceof Promise)) {
        return new Promise(handler);
    }
    if (typeof handler === "function") {
        // "Instead of handler, got setup function.
        // Would not buy again."
        var setup = handler;
        var deferred = Promise_defer();
        handler = Promise_getHandler(deferred.promise);
        try {
            setup(deferred.resolve, deferred.reject, deferred.setEstimate);
        } catch (error) {
            deferred.resolver.throw(error);
        }
    }
    handlers.set(this, handler);
}
Creates a promise.
@param handler may be a function or a promise handler object.
If it is a function, the function is called before this constructor returns,
with the arguments `resolve`, `reject`, and `setEstimate`, the former also
known as `return` and `throw`.
An exception thrown in the setup function will be forwarded to the promise.
A return value will be ignored.
The setup function is responsible for arranging one of the given functions
to be called with an eventual result.