Weapon attack callbacks, timer cancellation, Staff mesh
- Add Weapon::attackCb and timeOfAttack for per-weapon attack logic
- Move BHS projectile spawn into Bhs::attackCb lambda
- Add Timer::cancel with CancellationToken to abort deferred calls
- Add Player::onAttack: validates weapon slot still active before firing
- Store attackCancellationToken in Player; cancel on weapon switch
- Cancel attack timer on setCurWeapon to prevent stale callbacks
- Add Staff mesh (alara/Staff/OneBone as SkMeshAsset) and StillAnim
- Wire Staff idle and attack anims to StillAnim placeholder
- Remove weapon position offset from setCurWeapon (handled by socket)
- Assert mesh non-null in Player::tick instead of early return
- Clean up Player::tick: remove redundant mesh lock, simplify branches
- Fix weapon.cpp: remove stray #pragma once