switch to grunt-ts for timestamp-based conditional recompilation

So, slow compiles annoy me too:
https://github.com/uProxy/uproxy-networking/issues/110

The big missing feature for us, I believe, was support for outputting compiled JS to a separate folder hierarchy, i.e. from `build/typescript-src/xxx` -> `build/xxx`.

This pull request proposes a slightly different build process in which TypeScript files _can_ be compiled "in-place". Roughly, the steps are:

1. symlink each file in every folder under `src/` under `build/`
2. symlink each directory under `third_party/` under `build/`
3. for each folder under `build/`:
  1. compile all the source files inside
  2. run all the tests inside
  3. create a folder under `dist/` and copy all the `*.js` and `*.d.ts` files to it

Lastly, each sample app's directory (in `dist/`) gets a copy of `dist/` in a `lib/` folder.

I spent a lot of time considering how to prevent breaking dependant repos and I believe, apart from sample apps, the eventual output is identical to today.

Graphically, you will end up with something like this on disk:

```
test/
├── build
│   ├── bar
│   │   ├── bar.d.ts -> ../../src/bar/bar.d.ts
│   │   ├── bar.js
│   │   ├── bar.js.map
│   │   ├── bar.spec.js
│   │   ├── bar.spec.js.map
│   │   ├── bar.spec.ts -> ../../src/bar/bar.spec.ts
│   │   └── bar.ts -> ../../src/bar/bar.ts
│   ├── foo
│   │   ├── foo.html -> ../../src/foo/foo.html
│   │   ├── foo.js
│   │   ├── foo.js.map
│   │   └── foo.ts -> ../../src/foo/foo.ts
│   ├── samples
│   │   └── helloworld
│   │       ├── helloworld.js
│   │       ├── helloworld.js.map
│   │       ├── helloworld.ts -> ../../../src/samples/helloworld/helloworld.ts
│   │       └── manifest.json -> ../../../src/samples/helloworld/manifest.json
│   └── third_party
│       └── angular -> ../../third_party/angular/
├── dist
│   ├── bar
│   │   ├── bar.d.ts
│   │   ├── bar.js
│   │   ├── bar.js.map
│   │   └── bar.ts
│   ├── foo
│   │   ├── foo.html
│   │   ├── foo.js
│   │   ├── foo.js.map
│   │   └── foo.ts
│   └── samples
│       └── helloworld
│           ├── helloworld.js
│           ├── helloworld.js.map
│           ├── helloworld.ts
│           ├── lib
│           │   ├── bar
│           │   │   ├── bar.d.ts
│           │   │   ├── bar.js
│           │   │   ├── bar.js.map
│           │   │   └── bar.ts
│           │   └── foo
│           │       ├── foo.html
│           │       ├── foo.js
│           │       ├── foo.js.map
│           │       └── foo.ts
│           └── manifest.json
├── Gruntfile.js
├── src
│   ├── bar
│   │   ├── bar.d.ts
│   │   ├── bar.spec.ts
│   │   └── bar.ts
│   ├── foo
│   │   ├── foo.html
│   │   └── foo.ts
│   └── samples
│       └── helloworld
│           ├── helloworld.ts
│           └── manifest.json
└── third_party
    └── angular
        └── angular.js
```

Ideally, only `dist/` would end up in the NPM. For now, we keep `build/` just to prevent disruption to dependant repos.

Time-wise, I see an initial time of ~44s for `grunt build` which drops to ~8s for subsequent builds without changes. Changing one source file, subsequent `grunt build`s take ~11s. Most of that ~8s is spent re-building Freedom and we can be smarter about that, e.g. use `grunt-contrib-watch`.

Nothing in this precludes future use of `grunt-contrib-watch` or Karma.

What's still TODO? I tried compiling churn against this version of `uproxy-lib` and I think the `base` target needs to be made re-useable. This was unavoidable, and shouldn't be hard to implement. Of course, I'll take the time to update the dependant repos if we feel this is worthwhile overall.
We seem to have lost this... intended?