Fix stretch_data=False

This is a fix for #226 which includes (or supersedes) #225.

This pulls out the logic for the range adjustments into a utility method `_adjust_range ` which is called from the `low_pos` and `high_pos` listeners in addition to the `screen_bounds` setter it was included in. It also removes the stray `abs` causing the traceback in #225.

To exercise this PR, you can run the following example script from @mdickinson :
```
from numpy import linspace
from scipy.special import jn

from chaco.api import ArrayPlotData, Plot
from enable.api import Component, ComponentEditor
from traits.api import HasTraits, Instance
from traitsui.api import Group, Item, View


class Demo(HasTraits):
    plot = Instance(Component)

    def _plot_default(self):
        x = linspace(-2.0, 10.0, 100)
        plot_data = ArrayPlotData(x=x, y=jn(3, x))
        plot = Plot(plot_data, origin="top left")
        plot.value_mapper.stretch_data = False
        plot.plot(("x", "y"))
        return plot

    traits_view = View(
        Group(
            Item(
                'plot',
                editor=ComponentEditor(),
                show_label=False,
            ),
        ),
        resizable=True,
    )


if __name__ == "__main__":
    demo = Demo()
    demo.configure_traits()
```

The `stretch_data = False` should lead to the data not being stretched along the y_axis. And this fixes the traceback that the above code leads as described in #225 .