In most of the game examples the Input signal is a map of some other signals sampled on a time delta, something like this:

Signal.sampleOn delta (Signal.map2 (,) delta Keyboard.space)

However this means that I won't be able to get discrete key presses, just whether the space is currently pressed or not. Let's say I want to build a double jump feature, I kinda have to know whether the key was just pressed and not just whether the key is pressed.

This is actually how the Elm Architecture Tutorial recommends that you structure your code.

You have the Model of the app that moves from one state to the next based on the inputs (actions). This model is mapped with the view to produce the signal that ends in main. The more advanced form routes some tasks in order to facilitate side-effects like Http calls.