Goals:
- support vsynced double and triple buffering
- zero buffer copies
User space execution flow:
- block on free_queue.size() > 0
- lock free_queue, remove top element, unlock
- acquire buffer handle
- map buffer into virtual memory region
- draw into buffer