```python
def layout_columns(rows: list[list[str]], aligns: str) -> list[str]:
    if not rows:
        raise ValueError("Empty table is not allowed")
    
    if len(set(len(row) for row in rows)) != 1:
        raise ValueError("All rows must have the same number of cells")
    
    if len(aligns) != len(rows[0]):
        raise ValueError("Alignment spec must match the number of columns")
    
    if any(char not in 'lrc' for char in aligns):
        raise ValueError("Alignment spec can only contain 'l', 'r', or 'c'")
    
    if any(not isinstance(cell, str) for row in rows for cell in row):
        raise ValueError("All cells must be strings")
    
    col_widths = [max(len(cell) for cell in column) for column in zip(*rows)]
    
    def format_cell(cell: str, width: int, align: str) -> str:
        if align == 'l':
            return cell.ljust(width)
        elif align == 'r':
            return cell.rjust(width)
        else:
            padding = width - len(cell)
            left_pad = padding // 2
            right_pad = padding - left_pad
            return f"{' ' * left_pad}{cell}{' ' * right_pad}"
    
    lines = []
    for row, align in zip(rows, aligns):
        formatted_row = [format_cell(cell, width, align) for cell, width, align in zip(row, col_widths, aligns)]
        lines.append('  '.join(formatted_row).rstrip())
    
    return lines
```