So your slots cover 0-44, player inventory is 45-71, and hotbar 72-80. Your transfer method override only checks if index is storage, move to storage, else try and merge to storage. So you don't have any logic to move into the player inventory.
You have to override canBreatheUnderwater and make it return true always. Anyway if you are making a fish like entity, why not taking a look at how vanilla implements water mobs? You can find useful information in the classes: AbstractFishEntity, WaterMobEntity and GuardianEntity
In addition, you could store the supplier in a Lazy. What they essentially do is use the supplier once to grab the item and then keep the first accessed result. This makes the result deterministic and unchangeable (which is pretty much what you're going for).