smarter execution flow

@williamboxhall The current execution flow is too limited, it is capable to batch requests only for simple scenarios. This change introduces a smarter execution flow that allows to batch requests even in deep nested ```flatMap``` compositions.
Wonder what this result.liftToTry business is for if we are always ultimately going to return `Future.value(List())`. Does it have some side-effect I'm not aware of? I'm guessing it does but I can't figure it out :)