pluggable autodomain via Domainer object

Now that #531 is merged in, we can actually do #455. This branch introduces the `Domainer` object.

```
var xScale = new Plottable.Scale.Linear()
             .setDomainer(new Plottable.Domainer().pad().nice());
```

This lets you turn on and off common settings for autodomaining, and gives us a place to put more of these options (include 0, etc.).

Also, you can set your own function if you want. Here's the default one:

```
new Plottable.Domainer((extents: any[][]) => [d3.min(extents, (e) => e[0]), d3.max(extents, (e) => e[1])])
```

This means that `scale.padDomain()` and `scale.nice()` are removed, you must go though a `Domainer` object.
Also, the reason it has a domain of `[0, 1]` instead of is `[0, 8]` is because there is no data, and no data means a domain of `[0, 1]`.

@jtlan, if the user sets their own function for the `Domainer`, do you think their function should have to deal with `extents = []`, or should we just keep the code as above?