```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 not in used:
            used[key] = 0

        remaining = remaining_for(used, key, allowance)
        if units <= remaining:
            used[key] += units
        else:
            denied.append(draw)

            # If the draw was refused, we need to adjust the remaining
            # for the next draw, but since we're processing in order,
            # we don't need to do anything here this loop iteration.

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

def remaining_for(used: dict, key: str, allowance: int) -> int:
    if key not in used:
        return allowance
    return allowance - used[key]
```