Make `isPromise` always return a boolean.

`isPromise` returned the object to test when it was falsy, instead of returning false. For example `isPromise(null)` would return `null`. For the sake of consistency `isPromise` now always returns a boolean.

Also updates `isPromiseAlike` and adds tests for both.

Finally this also fixes an edge-case bug with `isPromise` and `isPromiseAlike` where truthy non-objects who had `promiseDispatch` or `then` methods would be false positives. For example, if someone added a `then` method to `Boolean.prototype`, then `isPromiseAlike(true)` would return `true`.