¿Cómo puedo saber si un objeto es una promesa jQuery / diferida?

Tengo una función que toma un solo argumento. Necesito poder decir si este argumento es un jQueryPromise oDeferred objeto. Si no es así, entonces el valor puede ser de cualquier tipo y tener propiedades, por lo que no es seguro solo por la presencia de los métodos de promesa.

Aquí hay un ejemplo de cómo me gustaría que se comportara mi función:

function displayMessage(message) {
  if (message is a Promise or Deferred) {
    message.then(displayMessage);
  } else {
    alert(message);
  }
}

Observe el manejo recursivo de las promesas: si una promesa se resuelve con otro valor de promesa, no la mostramos, esperamos que se resuelva. Si vuelve otra promesa, repita.

Esto es importante porque si este no fuera el caso, solo podría usarjQuery.when:

function displayMessage(message) {
  jQuery.when(message).then(function(messageString) {
    alert(messageString);
  });
}

Esto manejaría valores y promesas de valores correctamente ...

displayMessage("hello");                            // alerts "hello"
displayMessage(jQuery.Deferred().resolve("hello")); // alerts "hello"

... pero una vez que llegamos a las promesas de promesas de valores, se rompe:

displayMessage(jQuery.Deferred().resolve(
  jQuery.Deferred().resolve("hello")
));                                                 // alerts "[object Object]"

jQuery.when es capaz de decir si un valor es una promesa, por lo que aparentemente es posible. ¿Cómo puedo comprobar?

Respuestas a la pregunta(2)

Su respuesta a la pregunta