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.

I agree, I'll change it to something else like `size`.

> Also shouldn't we do this in the end instead of beginning? Because I see that we removing some wh stuff below.

The `.wh.` files have a size of `0` anyway so it's okay to do it here.