function coerce(self, x) {
		if (x === self) {
			return rejected(new TypeError());
		}

		if (x instanceof Promise) {
			return x;
		}

		try {
			var untrustedThen = x === Object(x) && x.then;

			return typeof untrustedThen === 'function'
				? assimilate(untrustedThen, x)
				: fulfilled(x);
		} catch(e) {
			return rejected(e);
		}
	}
Coerces x to a trusted Promise
@param {*} x thing to coerce
@returns {*} Guaranteed to return a trusted Promise.  If x
  is trusted, returns x, otherwise, returns a new, trusted, already-resolved
  Promise whose resolution value is:
  * the resolution value of x if it's a foreign promise, or
  * x if it's a value