add ;
move the node compat apis from libecho to a separate module.

This does require us to add a --module flag when we're using @node-compat (for now), but it also means that
tests/programs that don't use the apis don't require the module, which is nice.

The following code:

  let os = require('os');
  let path = require('path');
  let fs = require('fs');
  let spawn = require('child_process').spawn;

can now be es6-ified and written as:

  import * as os from            '@node-compat/os';
  import * as path from          '@node-compat/path';
  import * as fs from            '@node-compat/fs';
  import * as child_process from '@node-compat/child_process';
  let spawn = child_process.spawn;

The last 2 lines would become 'import { spawn } ...' when native modules can explicitly list their exports.
unfortunately a few changes collided in my local tree.

complete the external module support for import decls that started with the node-compat stuff.

now if you prefix the module name with a '@', the GatherImports pass won't do any path manipulation on it.
So if you want to import the llvm module, use:

  import * as llvm from '@llvm';

Also, finally clean up the _ejs_object_new + _ejs_object_create mess.  Now the former is used when you want to
create an object with both __proto__ and specops, and the later is used for creating an object with specified
__proto__, but _ejs_Object_specops.  This cleans up a lot of rather brittle code where the runtime was checking
for known prototypes in _ejs_object_create and then supplying specops for you.  Now if you want a particular
exotic object you must specify things for yourself.