By making a custom class that extends GuiScreen or something and rendering the things as you want here. To see how to render things there you can look at vanilla's classes for examples.
The key bindings don't have a registry associated with them, just create a new KeyBinding object and register it using ClientRegistry.registerKeyBinding during pre-init. That's all you have to do.
To then check whether the key is pressed use KeyBinding#isKeyDown (in a tick event to check if it's hold down) or KeyBinding#isPressed in a KeyEvent to check whether the key being pressed is yours.
Use a custom implementation of IItemHandler#insertItem and IItemHandler#extractItem. Both methods give you a slot as a parameter.
If you want extraction/insertion to be based on the side you can return a wrapper around your IItemHandler based on the side that only exposes the slots you want to expose for necessarry operation in getCapability. Note that you would still need to use a custom implementation of IItemHandler#insertItem and IItemHandler#extractItem.
use Entity#sendMessage. If you are on the client it will just add the message to the player's chat, otherwise it will just send a packet with the message to that player.
Why are you scheduling this as a task to the client thread? Shader binding must be done on the GL/render thread.
Also the player should never be null during RenderGameOverlay event.
Additionally rendergameoverlay event fires multiple times per frame per element being rendered. You need to check the one currently rendered.