Почему не останавливается таймер?
Потому что self.stop();, и при этом переменная self не объявлена.
Так вот работает: https://jsfiddle.net/o940649p/2/
P.S: Когда-то делал похожую штуку, можете посмотреть https://jsfiddle.net/Stalk/mLu8v4k6/
Можно так:this.start = function() {
  	//console.log(interval);
  	if (working) return;
  
  	position = 0;
  	timer = window.setInterval(function(self) {
    	//console.log('timer');
    	position += step;
      on_step(position, from, to);
      if (position >= to) {
      	console.log('end1');
      	self.stop();
      }
    }.bind(null, this), interval);
    on_start();
    working = true;
    on_step(position, from, to);
  };
Или так:this.start = function() {
  	//console.log(interval);
  	if (working) return;
  
  	position = 0;
  	timer = window.setInterval(function() {
    	//console.log('timer');
    	position += step;
      on_step(position, from, to);
      if (position >= to) {
      	console.log('end1');
      	this.stop();
      }
    }.bind(this), interval);
    on_start();
    working = true;
    on_step(position, from, to);
  };Во всех этих интервалах контекстом по умолчанию идет переменная window.