libcore: make iterator adaptors `Clone`/`Copy`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)
From my PR message:

"(Because of #19358 I had to move the struct bounds from the where clause into the parameter list)"