Remove unnecessary `as[_mut]_slice`/`to_string()` calls

Now that we have an overloaded comparison (`==`) operator, and that `Vec`/`String` deref to `[T]`/`str` on method calls, many `as_slice()`/`as_mut_slice()`/`to_string()` calls have become redundant. This patch removes them. These were the most common patterns:

- `assert_eq(test_output.as_slice(), "ground truth")` -> `assert_eq(test_output, "ground truth")`
- `assert_eq(test_output, "ground truth".to_string())` -> `assert_eq(test_output, "ground truth")`
- `vec.as_mut_slice().sort()` -> `vec.sort()`
- `vec.as_slice().slice(from, to)` -> `vec.slice(from_to)`

---

Note that e.g. `a_string.push_str(b_string.as_slice())` has been left untouched in this PR, since we first need to settle down whether we want to favor the `&*b_string` or the `b_string[]` notation.

This is rebased on top of #19167

cc @alexcrichton @aturon 
These three implementations merely defer their job to the `impl PartialEq<[B]> for [A]` one, where the signature of `eq` is `fn eq(&Self = &[A], &[B])`. The `*self` vs `&**self` is just about playing the deref game:

- In this case `self` has type `&&[A]` so `*self` has type `&[A]`
- In case above, `self` has type `&Vec<A>`, `*self` has type `Vec<A>`, and the next `*` actually triggers `Deref<[A]>`, so `&**self` has type `&[A]`.
- In case below, `self` has type `&&mut [A]`, `*self has type "`&mut [A]`" (yes, I know the compiler won't actually let you do that), and the next `&*` is a "explicit immutable reborrow" to get `&[A]`.

Equivalently, I could have written `&**self` in all these three cases.