Basic middleware support

Full disclosure: this is my first time ever messing with nodejs and all that serverside javascript stuff, so I'm still a bit confused about how `require` and package management works (also, async programming). This PR is not as much a PR as an RFC on how to improve that code (and also a "do you want middleware support in hipache?", question to which "no" would be a perfectly understandable answer). So if there's anything that could be done better, please let me know.

Another thing, I would like to make module paths in the config.json relative to the config.json file itself. I'm not sure how to do that since nobody gets to know the config file's path except `bin/hipache` (which, honestly, is not helping in this particular case).

So how does it work? Well the user can now declare an array of paths in the configuration, like so:
```json
{
    "server": {
        // default stuff omitted for brevity

        "stack": [
            "/path/to/module.js"
        ]
    }
}
```
Each path in this array will be `require`d and should export one single function accepting 4 arguments:

1. the worker's instance
2. the request
3. the middleware stack
4. a *finished* callback

The module can then proceed to manipulate the middleware stack, and must call the *finished* callback when finished to continue the resolving of the paths.

Performances should not be impacted a lot since `require` has an internal cache.

Here's a quick example / PoC, a module that checks whether authentication is configured for the current vhost, and adds auth middlewares accordingly:


```javascript

'use strict';

var passport = require('passport'),
    DigestStrategy = require('passport-http').DigestStrategy;

module.exports = function(hipache, req, stack, next) {
    hipache.cache.redisClient.exists(['auth:' + req.headers.host], function(err, exists) {
        if (err) { throw err; }
        if (exists) {
            passport.use(new DigestStrategy(function(username, done) {
                hipache.cache.redisClient.hget('auth:' + req.headers.host, username, function(err, password) {
                    if (err) { return done(err); }
                    if (null === password) { return done(null, false); }

                    return done(null, username, password);
                });
            }));

            stack.push(passport.initialize());
            stack.push(passport.authenticate('digest', { session: false }));
        }

        next();
    });
}
```