libcore: make iterator adaptors `Clone`able

closes #12677 (cc @Valloric)
cc #15294

r? @aturon / @alexcrichton 

(Because of #19358 I had to move the struct bounds from the `where` clause into the parameter list)