Refactor pretty printing to handle the white space at the AST level

We previously determined when to add the whitespace at the token level. That lead to a bunch of complicate switch statements. With this we handle the formatting at the AST level which simplifies the code significantly and it also allows us nicer result.

Review URL: https://api.github.com/repos/google/traceur-compiler/issues/795

Closes #795.
Expose LoaderHook functions on Loader class

Normalize, locate, and fetch tested.

Review URL: https://api.github.com/repos/google/traceur-compiler/issues/796

Closes #796.
Rename code generation starget function ModuleStore.registerModule -> Sy...

...stem.register()

Review URL: https://api.github.com/repos/google/traceur-compiler/issues/797

Closes #797.
Type assertion update

This is a big commit that contains three changes described below. 

Originally it was three different commits as it should be, but during the code review I significantly changed the whole thing and so it would take me a lot of time to split it back into coherent commits, as all the changes depend on each other.


1/ assert all arguments with assert.argumentTypes()

```js
function request(url: String, callback: Function) {}

// before:
function request(url, callback) {
  assert.type(url, String);
  assert.type(callback, Function);
}

// after:
function request(url, callback) {
  assert.argumentTypes(
    url, String,
    callback, Function
  );
}
```

Instead of asserting each argument on its own, we assert all of them. That has benefits:
- we can show all errors (instead of throwing on first incorrect argument),
- we can show incorrect arg position.

2/ assert function return value with assert.returnType()

```js
function reverse(str): String {}

// before
function reverse(str) {
  return assert.type(str, String);
}

// after
function revers(str) {
  return assert.returnType(str, String);
}
```

There are some advantages of this approach:
- the assert library can show different error for return value (eg. "Function has to return x"),
- the assert.returnType() has to return the actual value, but assert.type() does not have to.

3/ replace value types with assert.x

```js
function foo(a: string, b: number, c: boolean, d) {}

// transpiles into
function foo(a, b, c) {
  assert.argumentTypes(
    a, $traceurRuntime.type.string,
    b, $traceurRuntime.type.number,
    c, $traceurRuntime.type.boolean,
    d, $traceurRuntime.type.any
  );
}
```