Ability to catch and rewrite backend's tab-completion responses

###### The issue:
It is not currently possible to catch tab-completion responses from backend servers (e.g. Spigot) to clients. However, this would be a helpful feature, since currently, to block tab-completion responses, server owners have to install a plugin on every backend server. 
###### Problems:
- [x] I have already created (nearly) working code<sup>[1]</sup> to resolve above issue, but I am unable to get it to write changes in the suggestions back to the packet. I have thought of possible fixes for that, but couldn't find any clean ones: 
  - writing to `buf` directly from the `DownstreamBridge#handle(TabCompleteResponse)` method would require a reference to the `PacketWrapper`
  - re-writing the `buf` in `#handle(PacketWrapper)` would require an ugly `instanceof` or handling in `EntityMap`
  - Changes in the API to allow for this would probably not be accepted just to support such a small event that I am not sure how many people could actually use.
- [x] I am not sure if this kind of event suits the goal of BungeeCord, ~~since I have not been able to find any code that rewrites backend->client (except `EntityMap`, but that's something else).~~

###### Relevant links:
- [I wanted to put something else here, but I forgot what, so take a link to the related plugin](https://github.com/xxyy/commandblockerultimate/)

<sup>[1]</sup> ~~I accidentally the imports, I will fix that once I get the confirmation that this PR has the chance of being pulled.~~

What I want to ask you for is clarification on whether such changes would be suitable for BungeeCord and, if so, some advice on properly writing back changes. 

*Thanks.*
Edge case: if this gets set to `null` rather than empty, you'll get a NullPointerException when the event completes (`results.toArray()` will throw it). Would it be better to mark this with `final`, and just make users mutate the list rather than replace it?

If you _really_ want users to be able to replace the list, I would mark it with the `@NonNull` annotation (but in that case, I would actually just suggest clearing the list and using the `addAll(Collection<String>)` method)