refactor: major cleanup with proper types, structs, and error handling
Reorganized into clean logical modules:
- Color struct with from_hex(), random(), full_block(), half_block()
- AnimParam enum (replaces raw string matching) with FromStr/Display
- Animation struct with proper parse() returning Result
- EyeState struct groups eye offset + closed state
- Clood struct replaces flat CloodParams with named fields
- AnimState handles parameter override/restore for animation frames
- LegLayout struct encapsulates leg positioning logic
- ColumnRegion enum for body/arm classification
- Terminal helpers: hide_cursor(), show_cursor(), write_frame()
Edge cases fixed:
- Color::from_hex returns Option (no panics on short/invalid strings)
- Invalid --color/--eyecolor warns and falls back to random
- Invalid --anim specs produce descriptive error messages
- Unknown anim params list all valid options
- Animation tick uses wrapping_add to prevent overflow
- All row/col clamping uses signed arithmetic to avoid underflow
- sanitized() ensures minimum dimensions before rendering