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.
I want to ensure that `container.Unlock()` is called as soon as possible, even if the call to `graphdriver.ContainerDiffSize()` panics for some reason. The old call to `container.Changes()` also aqcuired/released this lock and I wanted to make sure that I don't hold it much longer than I have to, i.e. deferring it to the end of this function, especially with the possibly long running call to `utils.TreeSize` later. I'm not sure if this is a common pattern, I can definitely change it if you have any suggestions.