Clean vLLM integration: use official paths, BF16 wo_a, proper weight mapper
- deepseek_v4.py: Fresh upstream copy with minimal NVFP4 changes
- wo_a uses quant_config=None (BF16 in NVFP4 checkpoint, no scales)
- Added _make_deepseek_v4_nvfp4_weights_mapper() using official WeightsMapper API
- Handles: self_attn→attn, mlp→ffn, gate_proj→w1, compressor renames, etc.
- Mapper selected by quant_config.get_name() == 'modelopt_fp4'
- deepseek_v4_attention.py: Fresh upstream copy with minimal NVFP4 changes
- Removed _wo_a_act_quant and custom CuTeDSL wo_a runner
- Added _apply_inv_rope_bf16() helper (inverse RoPE in BF16)
- Detects BF16 wo_a (no weight_scale_inv) and uses BF16 path
- FP8 einsum path kept as fallback for SM90 checkpoints
- BF16 path: inverse RoPE → wo_a() → wo_b() (standard linear methods)