Update:
I discovered that statements in the parent class JModelList's method populateState shold handle getting the list.start value from the request and set it in the state. This was overriding what I had in my populateState method in my own model class. Here's the relevant code from JModelList:
$app = JFactory::getApplication();
$value = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->getCfg('list_limit'), 'uint');
$limit = $value;
$this->setState('list.limit', $limit);
$value = $app->getUserStateFromRequest($this->context . '.limitstart', 'limitstart', 0);
$limitstart = ($limit != 0 ? (floor($value / $limit) * $limit) : 0);
$this->setState('list.start', $limitstart);
Where things still fail is in the getUserStateFromRequest method. It should be finding the limitstart value in the $app data. It does not get set when there is a "search" value present. I'm not sure how the limitstart value gets from "?start=20" in the URL to "["limitstart"]=>
int(20) in the $app data returned from JFactory::getApplication();
Getting closer I think. Any help would be appreciated.
Erik