Abstract I/O interface to support non-cli env.

An `Environment` object, when instantiated, now expects an (optional)
`Adapter` (the default adapter being `TerminalAdapter`, for CLI I/O
sinteraction). This abstraction layer allow for `Environment` clients
other than `yo` to provide their own I/O mechanics (e.g GUI inside of
a code editor plugin for yeoman).

An `Adapter` is an object wich exposes at least 3 methods:

* `prompt` - an [Inquirer.js](https://github.com/SBoudrias/Inquirer.js/)-like
function for collecting user input (available as Base.prototype.prompt)
to generators
* `diff` - function called to show the difference between two strings
* `log` - it's both a function and an object. See (lib/util/log.js)[lib/util/log.js]
for details of the default implementation and which methods are to be
supported.