Move and refactor scrolling logic to the interface class

- Handle scrolling within the interface class (where it is probably more
  appropriate) and only use the buffer class for dumb storage and state

- Store the scroll position as an offset from the buffer's bottom and
  not from the top

These changes should also fix some bugs and issues with the old
scrolling system (scrolling past the content, etc.)