Add support for Q and use native Promise as last option

since developers already using Promises in their code will be familiar with `.fail(fn)` instead of the native `.catch(fn)`.