vale, el problema lo tienes en que estas lanzando timeouts desde un for, entonces el for se ejecuta a la máxima velocidad posible y los timeouts quedan como en cola, para cuando el primer timeout se ejecuta, opacidad ya ha llegado al extremo opuesto.
https://jsfiddle.net/oLracp2v/3/