irq: handle: implemented hardware irq handles.

Added an implementation for hardware IRQ's. When a hardware IRQ is
triggered, the chip handler is called first. This handler is usually
irq_handle from kernel/irq/handle.c. This handle will then check if the
IRQ is enabled and valid. If all is good it will determine if its a SOFT
IRQ or HARD IRQ. Hard IRQs are handled instantly, in IRQ context, while
soft IRQs are handled at the next schedule call right before a context
switch in process context.

An IRQ can also have a thread associated with it, which can be woken up
when the IRQ has been handled by the driver. The driver should return
IRQ_WAKE_OWNER to do so.

Signed-off-by: Michel Megens <dev@michelmegens.net>