I think the way to arrange this might be:

1. if they throw, reject
2. if they return `promise2`, reject with `TypeError`
3. if they return a promise, adopt state
4. otherwise, let `then` be `returnValue.then`,
    1. if `then` is a function, call it, etc.
    2. otherwise, fulfill with `returnValue`.