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.
Okay, I can rework it to be less specific to our use case (not mention container at all), but what term do you suggest I use in place of 'image'? i.e., what are these IDs referring to? Should graphdriver refer to them as layer IDs, filesystem snapshot IDs, or something else?