```python
import re

def parse_option(segment: str) -> list:
    key_value = segment.split('=', 1)
    if len(key_value) != 2:
        raise ValueError(f"Invalid option '{segment}'")
    key, value = key_value
    if not re.match(r'^[a-zA-Z][a-zA-Z0-9_]*$', key):
        raise ValueError(f"Invalid key '{key}'")
    if value.startswith('"') and value.endswith('"'):
        value = value[1:-1]
    return [key, value]

def scan_pairs(text: str) -> list:
    if not isinstance(text, str) or text == "":
        raise ValueError("Input must be a non-empty string")
    
    pairs = []
    in_quotes = False
    current_segment = ""
    
    for char in text:
        if char == '"' and not in_quotes:
            in_quotes = True
        elif char == '"' and in_quotes:
            in_quotes = False
        elif char == ';' and not in_quotes:
            if current_segment.strip():
                pairs.append(parse_option(current_segment))
            current_segment = ""
        else:
            current_segment += char
    
    if current_segment.strip():
        pairs.append(parse_option(current_segment))
    
    return pairs

# Edge case checks
print(scan_pairs("mode=fast;retry=3"))  # Expected: [['mode', 'fast'], ['retry', '3']]
print(scan_pairs(""))  # Raises ValueError
print(scan_pairs("a=b;c=d;e=f"))  # Expected: [['a', 'b'], ['c', 'd'], ['e', 'f']]
print(scan_pairs("a=b;c=d;e=f;g=h"))  # Expected: [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h']]
print(scan_pairs('"quoted"=value;key=value'))  # Expected: [[u'quoted', u'value'], [u'key', u'value']]
```