Tidy up budget controller

I tidied up `BudgetController#update` to be less repetitive. However, this change also introduces a minor change in behavior:

If either a budget post or a budget row value sent to `BudgetController#update` fails, none of the changes will be made.

* `BudgetRow#sum` must not be negative
* DRY up `BudgetController#update`
* Tests for `BudgetController#update` rollbacks
* `BudgetPost#mage_arrangement_number` must exist