```python
from typing import List, Dict

def meter_draws(draws: List[List[str]], allowance: int) -> Dict[str, int]:
    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 len(key) == 0:
            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 and used[key] + units > allowance:
            denied.append(draw)
        else:
            used[key] = used.get(key, 0) + units
    
    return {'used': used, 'denied': denied}

def remaining_for(used: Dict[str, int], 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 len(key) == 0:
        raise ValueError("Key must be a non-empty string")
    
    return allowance - (used.get(key, 0) + remaining_for(used, key, allowance))
```