Implement frame traversal for the navtiming and restiming plugins

The approach I've taken is to add a `frames` array property to the request when accessible frames are detected by either plugin. The format of each object in `frames` is similar to the main beacon format, only nested. So each object in the array has a `u` property containing the URL and will also have properties from the `navtiming` plugin, the `restiming` plugin or both. They may have nested frames too, which may have etc and so on.

In doing this I made some changes to both plugins in order to get code-reuse. But essentially they are the same as they were before, with additional calls to some new functions that I added to the core module: `forEachFrame` and `addFrameVar`. Implementing those necessitated a further couple of private functions in the core module, `addVarTo` and `getAccessibleFrames`.

Tested in latest Chrome, Firefox & IE.

What do you think, any good?
Sorry for taking so long over this.

I've made the change locally based on what you said and the documentation on MDN, but it's not working at the moment.

The following implementation of `getAccessibleFrames` errors because `frameDocument` is `undefined`. It's the same as the code in the PR, except using `getElementsByTagName` to fetch the frames. Any idea what's up?

```javascript
function getAccessibleFrames (parent) {
    var url, result, frames, count, i, frame, frameDocument;

    parent = parent || w;
    url = parent.document.URL;

    if(cachedFrames[url]) {
        return cachedFrames[url];
    }

    result = [];
    frames = document.getElementsByTagName('iframe');
    if(frames.length === 0) {
        frames = document.getElementsByTagName('frame');
    }
    count = frames.length;

    for(i = 0; i < count; ++i) {
        try {
            frame = frames[i];
            frameDocument = frame.contentDocument || frame.contentWindow.document;

            result.push({
                url: frame.src || frameDocument.URL,
                window: frame.contentWindow,
                frames: getAccessibleFrames(frame)
            });
        } catch(e) {
            BOOMR.debug("Ignoring exception in getAccessibleFrames [" + frame.src + "]: " + e.message);
        }
    }

    cachedFrames[url] = result;
    return result;
}
```