Deliver B05 deposits and B06 cashier closing (DEC34-DEC36)

D57-D60: take a deposit at a payment point, apply held money to named
invoices, close a cashier's drawer against register-computed expected
figures, and return unapplied deposit money through the two-person refund
flow. Deposits, allocations and shifts live in the payment-point register
(DEC34); a closed shift never reopens and closing counts money rather than
moving it (DEC35); a deposit refund is the same request-then-a-different-
person-approves flow as any other till refund (DEC36).

New this slice: DepositService, ShiftService, DepositController,
ShiftController, the Deposit/DepositAllocation/Payer models, the deposits
and shifts views, the finance-recreate migration, and
DepositsAndCashierClosingTest (20 tests / 132 assertions) covering tenancy,
permissions, allocation bounds, shift closing and the deposit refund path.

- deposits.manage (FINANCE, sensitive) guards registering and retiring a
  payer, so a cashier who can see the page cannot silently add a sponsor;
  granted to the finance roles and tenant_admin.
- RefundService learns the deposit path: refundable is bounded by what the
  deposit still holds, and approval reverses the funding register row.
- Dashboard "collected" now sums the payment-point register rather than the
  dropped payments table.
- Deposits appear under finance.billing in the navigation, with a new
  Cashier shifts item.

Fixed while verifying this slice, each found by walking the running app:
/deposits returned 500 ($query() invoked on a builder); the deposits Blade
file never compiled (two @can, no @endcan, stray @endif, duplicate table
tag); every deposit taken with "None" selected 404'd (has() vs an empty
payer_id); the payer option loop 500'd as soon as a payer existed and would
have printed a literal typeLabel; a dead "Remove payer" button posted to the
create endpoint, now a real audited retire action; ShiftController called
User::hasRole(), which does not exist (roles are a relation); the 403 page
named "module" instead of the permission checked; and money rendered as "$"
where the house convention is NGN.

MigrationForeignKeyTest now records the first Schema::create per table, so
a drop-and-recreate no longer reads as an out-of-order foreign key, and the
polymorphic-allocation test skips with a reason when that table is gone.

Evidence: outputs/feature-evidence/B05-B06-deposits-and-cashier-closing/
rev-20261017-003 (11 screenshots walked as cashier -> supervisor ->
manager, plus verification.md and the test outputs). Full suite at this
point: 739 tests / 3165 assertions, 2 deliberate skips.
