don't rely on [function].name

`[function].name` is not available in IE10, or any other IE version.  It returns undefined.  There are various places in the code that rely upon this property:

https://gist.github.com/bitmage/c89bcd768bbc15e5d022

I've modified types.js with one potential solution: put all the types in the Types object, and use the object key as the type name.  I don't know if this approach will apply to the broader number of use cases listed above though.

I assume that we want to support this code in the browser, and that targets should include IE10.  I expect it will take a couple iterations to get this fixed and tested.  There are several approaches we might want to use:

1.  The easy route of course is to just add the name property.  While this is generally frowned on, in this case it is unlikely to cause incompatibilities, and it could be considered a 'shim/sham' to ES6.
2. [This approach](http://stackoverflow.com/a/6903860/1846335) could be used to detect the function name, without modifying any properties.
3. Use an approach similar to what I did in types.js - keeping track of the name and corresponding function in a data structure.  This will require additional code and workarounds at various places in the code base.

Would appreciate some feedback on what the preferred approach would be.

Also, are there any thoughts on porting the test base to run in a multi-browser environment such as SauceLabs?

Thoughts as to how this might apply to the rest of the StrongLoop/Loopback toolset?

Workarounds, shims that you're aware of?  I don't see any focus on this in the shims that I'm looking at.

Thanks,
Brandon
In summary this is what I'd like to see:

 - an external shim (use one if we can find one, create it if we cant)
 - ideally the shim is only bundled for ie6 (long term, or just nice to have)
 - Uses `defineProperty` like this:

```js
    Object.defineProperty(Function.prototype, 'name', {
        get: function() {
            var name = this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1];
            // cache the value / redefine this property
            Object.defineProperty(this, 'name', { value: name });
            return name;
        }
    });
```