Add smooth scrolling to the ScrollPanelWidget

It's back!
`ListOffset` will also set `smoothTargetListOffset` internally, which isn't clear from these blocks.  This is really the main thing that prompted my earlier request for comments.

I think we could make this logic more transparent and remove duplication by combining these conditionals and the `ListOffset` setter in a new `SetListOffset(value, smooth)` method (with `ListOffset` made get-only).