Build zoomable and pannable SVG canvas

This'll only work if the selection was bound to data using `.data()` (as apposed to `.datum()`, or if no data was bound). I doubt that this'll be a problem for `conversationComponent` specifically, but if we are planning on using this as a general pattern for all our components, maybe we should do something like `selection.node().hasChildNodes()` to see if this is the first draw or not.