terrain-forge 0.7.0

A modular procedural generation engine for terrain, dungeons, and maps
Documentation
# Migrating to v0.7.0

## Breaking Changes

### `generate_with_semantic` removed
```rust
// Before
let result = generate_with_semantic(&algo, &mut grid, seed);

// After
algo.generate(&mut grid, seed);
let semantic = SemanticExtractor::for_rooms().extract(&grid, &mut rng);
```

### `Cell::set_passable` required
If you implement `Cell` for a custom type, add:
```rust
impl Cell for MyCell {
    fn is_passable(&self) -> bool { /* ... */ }
    fn set_passable(&mut self, passable: bool) { /* ... */ } // NEW
}
```

### `FractalConfig.fractal_type` is now an enum
```rust
// Before
FractalConfig { fractal_type: "fbm".to_string(), .. }

// After
use terrain_forge::algorithms::FractalType;
FractalConfig { fractal_type: FractalType::Fbm, .. }
```

### `GlassSeam.config` is private
```rust
// Before
let gs = GlassSeam { config: GlassSeamConfig { .. } };

// After
let gs = GlassSeam::new(GlassSeamConfig { .. });
```

### `Algorithm` requires `Send + Sync`
All built-in algorithms already satisfy this. If you have a custom `Algorithm` impl holding non-Send types (e.g. `Rc`), switch to `Arc`.

### `Pipeline::add` removed
```rust
// Before
pipeline.add("rooms");

// After
pipeline.add_algorithm("rooms", None, None);
```