Optimize Optimizer

Speeds up migration optimization by about 60% by:
- Moving list construction from MigrationOptimizer.reduce() and .can_optimize_through() to module scope
- Caching result of name.lower() (and similar attributes) on Operation subclasses via @cached_property