The way I do it is by subscribing to the RenderGameOverlayEvent. Since this is only called client side, you can safely use Minecraft.getMinecraft() to access any client side information (like the player). You can then check the player is holding the desired item, and get whatever information you need.
About data tied to each player, I suggest you use Capabilities (have a search for it). I've not played with it much yet, but you can attach capabilities to players to store whatever data you want. You could then retrieve it in your overlay rendering to show the data on the screen.
Thanks for the help so far, but what class should I put the first part in?