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

from typing import List

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

def _is_leap(year: int) -> bool:
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

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

def _to_ordinal(date: List[int]) -> int:
    year, month, day = date
    if not all(isinstance(d, int) for d in date):
        raise ValueError("All components of the date must be integers.")
    if not (1 <= month <= 12):
        raise ValueError("Month must be between 1 and 12.")
    if not (1 <= day <= _month_length(year, month)):
        raise ValueError(f"Day must be between 1 and {_month_length(year, month)} for the given month and year.")
    prior = year - 1
    days = prior * 365 + prior // 4 - prior // 100 + prior // 400
    for earlier in range(1, month):
        days += _month_length(year, earlier)
    return days + day

def span_days(start: List[int], end: List[int]) -> int:
    if start > end:
        raise ValueError("Start date cannot be after end date.")
    return _to_ordinal(end) - _to_ordinal(start) + 1
```