WIP: Suggestion - Chart layout manages components

**WORK IN PROGRESS: DO NOT MERGE!!**

Currently resizing the chart, or updating the data, requires quite a lot of structural code:

https://github.com/ScottLogic/d3-financial-components/blob/gh-pages/getting-started.md#rendering-dynamic-charts

My suggestion is to use our chartLayout component to manage the axes, series and any other components that make up a chart.

In order to render a chart, you construct axes, scales, series and add these to the layout. It is then responsible for setting the axis/scale ranges and invoking 'call' on each component.

Here's a chart that supports re-sizing with my changes:

```
// create the chart layout
var chartLayout = fc.utilities.chartLayout();

// Render the initial layout
d3.select('#structured-chart')
    .call(chartLayout);

// Create some data
var startDate = new Date(2014, 1, 1),
    dayCount = 100;
var gsData = fc.utilities.dataGenerator()
    .seedDate(startDate)
    .generate(dayCount);

// Create scales
var xScale = fc.scale.dateTime() 
    .domainFromValues(gsData, ['date']);
var yScale = fc.scale.linear()
    .domainFromValues(gsData, ['low', 'high']);

// Create axes
var bottomAxis = d3.svg.axis()
    .scale(xScale)
    .orient('bottom')
    .ticks(10);
var leftAxis = d3.svg.axis()
    .scale(yScale)
    .orient('left')
    .ticks(5);

// Create some series
var ohlc = fc.series.ohlc()
    .xScale(xScale)
    .yScale(yScale);
var bollinger = fc.indicators.bollingerBands()
    .xScale(xScale)
    .yScale(yScale);

// add gridlines
var gridlines = fc.scale.gridlines()
    .xScale(xScale)
    .yScale(yScale);

// ############### New code below

// Add axis to the chartLayout. The layout is now responsible
// for setting the range of the scales associated with each axis
chartLayout.addAxisToContainer('bottom', bottomAxis);
chartLayout.addAxisToContainer('left', leftAxis);

// Add plot area components
chartLayout.addComponentsToPlotArea([ohlc, gridlines, bollinger]);

// Bind the data
chartLayout.getPlotArea()
    .datum(gsData)

function renderComponents() {
  // Render the chart, this ultimately involves invoking the 'call' method on the
  // various selections for the components added above
  chartLayout.render();
}

// perform an initial render
renderComponents();

// handle resize events, telling the chart to re-render
d3.select(window).on('resize', renderComponents); 
```