Require modules with promises

Changing the requireModules (and createModules) implementation to rely on promises. This way we can:

 - Make requireModules calls always async (before it was sometimes sync and sometimes async based upon whether the modules were loaded already)
 - Simplify the Ink core code greatly (and reduce its size)
 - Supply a promise library for our users and modules

The promise library I included is very tiny (it's less than 60 lines of code), so bloat shouldn't be a problem (I've managed to simplify so much, the Ink core reduced in size a bit even though I added the promise library and the Ink.promise() function).

Also, tested a lot of corner cases and fixed a bug that happened with reentrant requireModules calls.