feat: Add ODA Component manifest extraction (v0.3.0)

Adds `tmf-spec-parser oda` subcommand to fetch and extract ODA Component
(ODAC) manifests from the TM Forum staging repo. This is the data layer for
the upcoming Component architectural view in tmf-map, addressing LinkedIn
feedback that the current API schema-`$ref` view doesn't show ODA
architectural dependencies.

New modules:
- `oda_extractor.py`: normalizes v1beta2/v1beta3/v1 CRD versions into
  uniform Component records; extracts coreFunction.{exposedAPIs,dependentAPIs}
- `oda_fetcher.py`: fetches from tmforum-rand/TMForum-ODA-Ready-for-publication
  at tag v1.0.0 (35 components successfully fetched); handles nested
  Specification/ subdirectory structure
- `oda_emitter.py`: assembles oda_data.json + optional .js ES module

CLI:
  tmf-spec-parser oda --out ../tmf-map/src/oda_data.json --js
  tmf-spec-parser oda --components TMFC008,TMFC037  # subset

Results from live run:
- 35 components fetched (TMFC001-TMFC062 with gaps)
- 83 exposed APIs, 237 dependent APIs
- 58 unique APIs referenced (42 outside tmf-map's 16-API set)

Scope (per ADR-001): coreFunction only. Security/management/events/resources
deliberately deferred. The `required` flag is preserved on every API entry
and link for mandatory/optional edge styling in the renderer.

Config: added ODA_GITHUB_ORG, ODA_GITHUB_REPO, ODA_REPO_REF, ODA_CRD_VERSIONS,
ODA_SPEC_SOURCE. Existing tmforum-apis config untouched.

Tests: 28 tests across test_oda_extractor.py (19) and test_oda_emitter.py (9),
covering all three CRD shapes, placeholder filtering, missing fields,
kind/case insensitivity, build/write/js-module.

Docs: ADR-001 documents source choice, CRD version handling, output schema,
scope decisions, and open questions (multi-CRD coexistence, security function
inclusion, functional block colors, render-mode interaction).

Fix: Nested folder structure - manifests are in {component}/Specification/
subdirectory, not at component root. Fetcher now checks Specification/ if no
YAML found at root level.

Backwards-compatible: existing `generate` subcommand and tmf_data.json output
unchanged. PyYAML imported lazily inside `oda` subcommand with friendly error
message if missing. No breaking changes to any existing public surface.

Version bump: 0.2.6 → 0.3.0 (new public surface, additive changes only).
