Add support async scripts

/to @bajtos 
/cc @ritch 

The PR adds two enhancements for boot:

Allow boot scripts to be executed asynchronously
> module.exports = function(app, callback) {...}

This is a wrong direction. When the users does not provide callback to `boot` (or `execute`), we cannot simply assume that no boot script is async.

The code should be the same for both sync and async mode. When we are in sync and the boot script is async, we have two options:

 1. fail the boot process with a descriptive error message that includes path to the script file
 2. emit a descriptive warning and continue with the execution of boot scripts via `async.each`, i.e. wait for the script to finish before running the next script

I prefer to be strict and fail the boot immediately. That way the developer is forced to fix the problem immediately and thus avoid subtle race-condition bugs that are difficult to identify and debug.