Add DuckDB-based server-side JOIN with DuckDbTableReader abstraction
- DuckDbTableReader: sealed interface for feeding tables to DuckDB (Acero impl for current, NativeParquet impl for post-Acero future)
- ParquetQueryParser: join detection, alias extraction, DuckDB SQL rewrite
- ParquetManager: executeJoin() via DuckDB, buildJoinSchema(), resolveTableFiles()
- HadoopFlightSqlService: join-aware endpoint determination with single-server path (DuckDB join) and fallback (per-table Spark join)
- JoinIntegrationTest: self-join, schema extraction, alias parsing