Soak up extraneous `promise()` calls

Matches jQuery's ability to do $.when().promise().promise()
`when` should pass through non deferred arguments

Supports the convenient shorthand of `$.when(arg)` for
`$.Deferred().resolve(arg).promise()` a la jQuery.
Special case single or no argument resolves in `when()`

Better match jQuery's behaviour:

    $.when($.Deferred().resolve(1), $.Deferred().resolve())
        .done(function() {
            console.log(arguments);
        });

Logs: [1, undefined]

This is particularly important to maintain consistency with the notion
that `$.when()` with non-promise arguments is a shorthand for
`$.Deferred().resolve()`. That is:

    $.when(1, 2).done(function() { console.log(arguments); });

Does the same thing as:

    $.Deferred().resolve(1, 2).done(function() {
        console.log(arguments);
    });
Consider any object with `.promise()` as deferred in pipe