Add setters for all packet fields (with validation)
Many newer packets have been implemented as immutable and/or with private fields. It's very inconvenient for consumers of the library.
Just last week, I found myself working over AvailableCommandsPacket trying to debug an issue in #329 and found it very annoying that the properties weren't accessible, because it's a large packet and reconstructing the whole thing was too inconvenient.
In the past we probably went this way because packets used to contain their own buffers in PM3, so modifying packet fields wouldn't work consistently. This is no longer the case in PM4 and above, so that's no longer valid.
The main reason to not make packet fields public is basically just the need for validation. We've often had crashes on https://crash.pmmp.io that have been the result of plugins modifying public packet fields with invalid data. These usually involve arrays being populated with values of the wrong type. So, public packet fields don't seem like a good idea for any place where the type alone isn't enough to guarantee validity.
However, we can add setters for fields. There doesn't seem to be an obvious reason not to do this, other than it being a chore and creating a ton of boilerplate code for every packet and structure.
Some simple types should remain immutable, but I think we can allow mutating packets and large structures in most cases. Since protocol classes shouldn't be live very long anyway, I don't think mutability should be a big concern.
Were we able to go PHP 8.4 only, we'd be able to just use property hooks in cases where extra validation is needed. Sadly, that's not an option yet.