```python
def digit_word(digit: int) -> str:
    """
    Return the English word for a single digit.
    
    Args:
    digit (int): A single digit (0-9).
    
    Returns:
    str: The English word for the digit.
    
    Raises:
    ValueError: If the digit is not in the range 0-9.
    """
    if not 0 <= digit <= 9:
        raise ValueError("Digit must be in the range 0-9.")
    return "zero" if digit == 0 else f"{digit}th"

def digit_words(digits: str) -> str:
    """
    Return the English words for every digit in a run of digits, joined by single spaces.
    
    Args:
    digits (str): A string representing one or more digits.
    
    Returns:
    str: The English words for the digits, joined by single spaces.
    
    Raises:
    ValueError: If the input string contains non-digit characters.
    """
    if not digits.isdigit():
        raise ValueError("Input string must contain only digits.")
    
    words = []
    for digit in digits:
        words.append(digit_word(int(digit)))
    return " ".join(words)
```