Build zoomable and pannable SVG canvas

@justinvdm I also feel that components should manage all aspects of drawing (appending/deleting/updating), so looking at Mike's example again how about something like this:

In the directive's `repaint()` function:

```
canvas.datum(scope.data).call(conversation).call(transport);
```

Then a component can do the drawing:

```
// selection here is our canvas
selection.each(function (d, i) {
    var conversations = d3.select(this).selectAll('.conversation').data(d.conversations);
    // create new
    conversations.enter().append('g').attr('class', 'conversation');
    // update
    conversations.attr('transform', function (d) { return 'translate(' + [d.x, d.y] + ')'; });
    // remove
   conversations.exit().remove();
});
```

What do you think?