implementation of cloneDeep

see #455 
I'm excited to see this change. The other change I suggest is providing `copiedValue` as an argument like so:

```javascript
var baseCopy = function baseCopy(value, refFrom, refTo) {
    switch (toString.call(value)) {
        case '[object Array]':      return copyObj(value, [], refFrom, refTo);
        case '[object Date]':       return new Date(value);
        case '[object Function]':   return value;
        case '[object Object]':     return copyObj(value, {}, refFrom, refTo);
        default:                    return value;
    }
};
```

With these two changes, `copyObj` will be more streamlined:

```javascript
var copyObj = function copyObj(value, copiedValue, refFrom, refTo) {
    for (var idx = 0, len = refFrom.length; idx < len; idx++) {
        if (value === refFrom[idx]) {
            return refTo[idx];
        }
    }
    refFrom.push(value);
    refTo.push(copiedValue);
    for (var key in value) {
        copiedValue[key] = baseCopy(value[key], refFrom, refTo);
    }
    return copiedValue;
};
```