Only compute an amount no greater than the objects amount.
Compute amount based on remaining amount so that multiple promotion actions don't cause negative balance.
Fix AvailabilityValidator for saved records

Previously availability only considered inventory_units on the
target_shipment of a line_item. Since target_shipment is not persisted,
a saved line_item would become invalid when its variant ran out of
available inventory even if the inventory_units were already reserved.

Fixes #5208