add FlxTypedWeapon

Summary of this PR:

- Added FlxTypedWeapon due to the depreciation of `setAll()`. The replacement `ForEach` requires strictly typed members.
- Moved firing logics from FlxBullet to FlxTypedWeapon.
- Enhanced the bullets creation process. Weapon now calls a custom factory function to create a bullet. (`BulletFactory` replaces `BulletType` in constructor)
- Removed `onFireCallback` and `onFireSound` (they are basically duplicates of `onPostFireCallback` and `onPostFireSound`)

> That said, why do bullets need a reference to their weapon at all?

i asked this question to myself as well. I think mainly because `FlxWeapon` holds a reference to a parent who is "holding" the weapon. So this let the bullet trace back who "fired" the bullet through `weapon`.