Run Ember in node

This commit removes any strict dependencies on browser-only APIs.
Anything user agent specific (such as window, document, etc.) are
abstracted out into a new `environment` object.

Currently we feature detect whether a DOM implementation is available
and only enable certain behavior if so. The intent of the feature
detection is to determine if a DOM implementation is available, not
whether we’re running in the browser or in node. This makes it possible
to run Ember in a node environment with a “fake” DOM.

This commit also introduces some refactoring to the location APIs, such
that hardcoded document/history/navigator dependencies are reduced.

Note that some APIs are guarded with `environment.hasDOM` checks.
Code inside those guards can freely use DOM APIs, but some of those
APIs are needed for full server-side usage of Ember. This is a first
step that is designed to explicitly separate out code with DOM
dependencies from isomorphic code. Further PRs will implement the
Renderer and Location APIs for non-DOM environments.
Actually, this should work without the noop concat:

```javascript
var exportsTree = writeFile('export-ember', ';module.exports = Ember;\n');

return concat(mergeTrees([compiledSource, exportsTree]), {
   wrapInEval: false,
   inputFiles: ['ember.debug.js', 'export-ember'],
   outputFile: '/ember.debug.cjs.js'
 });
```