```python
"""How many days lie between two proleptic Gregorian calendar dates."""

MONTH_LENGTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]


def _is_leap(year):
    return year % 4 == 0


def _month_length(year, month):
    if month == 2 and _is_leap(year):
        return 29
    return MONTH_LENGTHS[month - 1]


def _to_ordinal(date):
    if not all(isinstance(x, int) for x in date):
        raise ValueError("Date components must be integers.")
    if not 1 <= date[0] <= 9999:
        raise ValueError("Year must be between 1 and 9999.")
    if not 1 <= date[1] <= 12:
        raise ValueError("Month must be between 1 and 12.")
    if not 1 <= date[2] <= _month_length(date[0], date[1]):
        raise ValueError("Day must be between 1 and the last day of the month.")
    year, month, day = date
    prior = year - 1
    days = prior * 365 + prior // 4
    for earlier in range(1, month):
        days += _month_length(year, earlier)
    return days + day


def span_days(start: list, end: list) -> int:
    if start > end:
        raise ValueError("Start date must be before end date.")
    return _to_ordinal(end) - _to_ordinal(start)
```