feat(runtime): add memoization to genericType()

This is an initial implementation (lacking unit tests).

The rationale is that we need `genericType(Foo, Bar) === genericType(Foo, Bar)` for the Dependency injection in Angular.

Before this PR it was not possible to detect when two generic types match (as they are not ===).


`type-assertion.js` is part of the runtime loaded before the polyfills are loaded. @arv was thinking about uses of `new Map()` in the compiler, which is loaded after the polyfills.  

If we move `type-assertion.js` then we couldn't use it on polyfill code.  We have to start somewhere.