ui: factor Input.reset out of app
Input: factor out finish method
Input: add done state so that finish can only happen once
Input: differentiate between data and done events