```python
def meter_draws(draws: list, allowance: int) -> dict:
    if not isinstance(allowance, int) or allowance <= 0:
        raise ValueError("Allowance must be a positive integer.")
    
    used = {}
    denied = []

    for draw in draws:
        key, units = draw
        if not isinstance(key, str) or not key:
            raise ValueError("Key must be a non-empty string.")
        if not isinstance(units, int) or units <= 0:
            raise ValueError("Units must be a positive integer.")

        if key in used:
            remaining = used[key]
        else:
            remaining = allowance

        if units <= remaining:
            used[key] = remaining - units
        else:
            denied.append(draw)

            # If the key is not in the ledger, initialize it with zero spend
            if key not in used:
                used[key] = 0

    return {"used": used, "denied": denied}

```

```python
def remaining_for(used: dict, key: str, allowance: int) -> int:
    if not isinstance(allowance, int) or allowance <= 0:
        raise ValueError("Allowance must be a positive integer.")
    if not isinstance(key, str) or not key:
        raise ValueError("Key must be a non-empty string.")

    return used.get(key, 0) + allowance
```