Update Promise

- use setImmediate where available
- properly handle promises in Promise.resolve
- cache slice method
- separate polyfill from assignment (Object.defineProperty)