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


You know, there is `String()` method for `bytes.Buffer`, so it will automatically transformed to `string` by `%s`.