`isForwardRange`, `isBidirectionalRange`, and `isRandomAccessRange` now take an optional element type

In Phobos 2.106, an optional second template parameter was added to
`isInputRange` to enable conveniently checking a range's element type. Now, the
same parameter has been added to `isForwardRange`, `isBidirectionalRange`, and
`isRandomAccessRange`.

As before, if a second type argument is passed to one of these templates, the
range's element type is checked to see if it is
$(DDSUBLINK spec/const3, implicit_qualifier_conversions, qualifier-convertible)
to the given type, and this additional check must pass in order for the
template to evaluate to `true`.

Examples:
---
// exact match
static assert( isForwardRange!(int[], int));

// match with qualifier conversion
static assert( isBidirectionalRange!(int[], const(int));

// not a match
static assert(!isRandomAccessRange!(int[], string));
---
