```python
from typing import List

def prune_listing(listing: List[str], rules: List[str]) -> List[str]:
    def is_valid_path(path: str) -> bool:
        if not isinstance(path, str):
            return False
        path = path.strip('/')
        if '/' in path and any(segment == '' for segment in path.split('/')):
            raise ValueError("Path contains invalid segments")
        return True

    def is_valid_rule(rule: str) -> bool:
        if not isinstance(rule, str):
            return False
        if rule.startswith('!') and len(rule) > 1 or not rule.strip('!').split('/'):
            raise ValueError("Rule must be '!' or a valid pattern")
        return True

    def match_pattern(path: str, pattern: str) -> bool:
        path_segments = path.split('/')
        pattern_segments = pattern.split('/')
        
        for i in range(min(len(path_segments), len(pattern_segments))):
            if pattern_segments[i] == '*':
                continue
            elif pattern_segments[i] != path_segments[i]:
                return False
        
        # If all segments matched, the rest of the path should be empty or a directory prefix
        return not path_segments[i:] or path_segments[i].endswith('/')

    def prune(path: str) -> bool:
        for rule in rules:
            if is_valid_rule(rule):
                if match_pattern(path, rule):
                    # If it's a keep rule, we want to keep the path
                    return True
        return False

    return [path for path in listing if is_valid_path(path) and prune(path)]
```