That's because when a tween is defined it is rendered immediately to the start position, usually only noticed in the case of 'from tweens'. Because you are using set at the start of timeline, it is behaving same.
You can set immediateRender to false on first tween and it will behave as expected. Well and you can use just fromTo tween to same thing.
// To tween
tl.set(".slide", { opacity: 1, immediateRender: false });
tl.to(".slide", 1, { x: 300, opacity: 0 });
// fromTo tween
tl.fromTo(".slide", 1, { opacity: 1, immediateRender: false }, { x: 300, opacity: 0 });