Scale doesn't know about data, renderer does

Before, scales knew what their data was and would compute an extent from that whenever it updated, with updates flowing like `renderer <- scale <- data`. However, sometimes the extent is better known by the renderer, for example, a bar chart knows that it must include enough space for the last bar.

This branch rearranges things so that scales don't know about their data, they only have  a renderer to extent mapping. The new flow of control in `scale <-> renderer <- data`, where a data update causes the renderer to compute a new extent, send that new extent to the scale, which potentially changes its domain an signals back.
so, there's a mapping from (renderer, attribute) pairs onto scales. you are collapsing all of the attributes together on the renderer so that the scale only maintains a mapping from renderers to extents. i don't see why collapsing it on the renderer is the right place to do it, now you're dpulicating extent-expansion logic on both the renderer and the scale. just give the scale the (renderer, attribute) pair and let the scale be responsible for combining everything. this also avoids the problem of the double loop and uniqness testing that i describe in the two comments above