function crawl(src, target) {
    for(var k in src) {
        var obj = src[k];
        if(obj.valType) {
            target[k] = obj.dflt;
        } else {
            if(!target[k]) {
                target[k] = {};
            }
            crawl(obj, target[k]);
        }
    }
}
This will be transferred over to gd and overridden by
config args to Plotly.newPlot.

The defaults are the appropriate settings for plotly.js,
so we get the right experience without any config argument.

N.B. the config options are not coerced using Lib.coerce so keys
like `valType` and `values` are only set for documentation purposes
at the moment.