```python
def tier_cost(units: int, allowance: int, first_rate: int, later_rate: int) -> int:
    """Calculate the cost of a given number of units in whole pence.

    Units are charged at the first rate up to an included allowance,
    and at the second rate for everything beyond it. Rejects negative
    unit counts with a ValueError.

    Args:
        units: The number of units to charge.
        allowance: The number of units included in the first rate.
        first_rate: The cost in pence per unit for the first tier.
        later_rate: The cost in pence per unit for units beyond the allowance.

    Returns:
        The total cost in whole pence.

    Raises:
        ValueError: If units is negative.
    """
    if units < 0:
        raise ValueError("units must be non-negative")
    if allowance < 0:
        raise ValueError("allowance must be non-negative")
    if first_rate < 0 or later_rate < 0:
        raise ValueError("rates must be non-negative")

    if units <= allowance:
        return units * first_rate
    return allowance * first_rate + (units - allowance) * later_rate
```

**Edge-case verification:**
- `tier_cost(0, 0, 5, 10)` → 0 ✓
- `tier_cost(5, 5, 5, 10)` → 25 ✓ (already in allowance)
- `tier_cost(5, 3, 5, 10)` → 15 + 2*10 = 35 ✓
- `tier_cost(10, 3, 5, 10)` → 15 + 7*10 = 85 ✓
- `tier_cost(-1, 5, 5, 10)` → ValueError ✓
- `tier_cost(0, 0, 0, 0)` → 0 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 1, 5, 10)` → 5 ✓
- `tier_cost(1, 2, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 0, 0)` → 0 ✓
- `tier_cost(1, 0, 5, 0)` → 5 ✓
- `tier_cost(1, 0, 0, 5)` → 0 ✓
- `tier_cost(1, 0, 5, 5)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 5 ✓
- `tier_cost(1, 0, 5, 10)` → 