checkSafePromise = (pr, check) => {
  return (
    (isFrozen(pr) || CX(check)`${pr} - Must be frozen`) &&
    (isPromise(pr) || CX(check)`${pr} - Must be a promise`) &&
    (getPrototypeOf(pr) === Promise.prototype ||
      CX(check)`${pr} - Must inherit from Promise.prototype: ${q(
        getPrototypeOf(pr),
      )}`) &&
    checkPromiseOwnKeys(/** @type {Promise} */ (pr), check)
  );
}
Under Hardened JS a promise is "safe" if its `then` method can be called
synchronously without giving the promise an opportunity for a
reentrancy attack during that call.

https://github.com/Agoric/agoric-sdk/issues/9
raises the issue of testing that a specimen is a safe promise
such that the test also does not give the specimen a
reentrancy opportunity. That is well beyond the ambition here.
TODO Though if we figure out a nice solution, it might be good to
use it here as well.

@param {unknown} pr The value to examine
@param {Checker} check
@returns {pr is Promise} Whether it is a safe promise