Rework internal flatten function

http://jsperf.com/new-flatten

For lodash speeds we'll need to change `push.apply` to something similar to [this clever logic](https://github.com/lodash/lodash/blob/master/lodash.js/#L1616-1619). Let me know if that's more desirable, I have it [already prepared](https://github.com/megawac/underscore/blob/flatten2/underscore.js#L465-483) and its in the jsperf
> For lodash speeds we'll need to change push.apply to something similar to this clever logic.

Actually that's not some micro-opt it's to solve flattening large arrays. Different engines have different limits on how many arguments can be passed to `.apply`. For more info see the [commit](https://github.com/lodash/lodash/commit/7a278db29efa53db030487c3921f84a89974d902) & [#349](https://github.com/lodash/lodash/issues/349).