Feature/fix perf

/to @ritch 
/to @bajtos 

Here are a few patterns I use:

1. Convert array.forEach(fn) to for(var k = 0; k < keys.length; k++) {...};
See: http://jsperf.com/fast-array-foreach

2. Avoid Object.defineProperty()
See: http://jsperf.com/object-defineproperty-vs-definegetter-vs-normal/21

3. Avoid array.indexOf() 
If you just move the property definition to model definition you can avoid calling `defineProperty` for every instance and still ensure the properties are not enumerable. 
Just define the non enumerable properties on the prototype and initialize them here.
Non getter/setter defined properties perform similarly to normal properties. Calling `defineProperty` is where we are taking the performance hit. [Wrote a JSPerf to illustrate this](http://jsperf.com/non-getter-properties).