Make BaseInput#read block the main thread, add BaseInput#poll(interval, &block)