Refactor use of graphdriver.Differ

Some graphdrivers are Differs and type assertions are made
in various places throughout the project. Differ offers some
convenience in generating/applying diffs of filesystem layers
but for most graphdrivers another code path is taken.

This patch brings all of the logic related to filesystem
diffs in one place, and simplifies the implementation of some
common types like Image, Daemon, and Container.
@jlhawn Thanks for your update. I think I did not express myself well and sorry for that! In Go conventions, when you have a function named `NewSomething` it usually returns a pointer to a struct named `Something`. I initially suggested that you name this function `SimpleDriver` instead, because it would make a valid simple driver out of an incomplete driver, just like ioutil.NopCloser wraps io.Reader to return an io.ReadCloser. Sorry if that was not clear.

So I suggest: `s/SimpleDriver/abstractDriver` (if someone has a better name I'm all for it), `s/extendedSimpleDriver/simpleDriver` and `s/NewExtendedSimpleDriver/SimpleDriver`.

WDYT?