Refactor to optimize storage driver ApplyDiff()

To avoid an expensive call to archive.ChangesDirs() which walks two directory
trees and compares every entry, archive.ApplyLayer() has been extended to
also return the size of the layer changes.

might fix #9445


I don't like name bytes, because this is name of stdlib package.
Also shouldn't we do this in the end instead of beginning? Because I see that we removing some `wh` stuff below.