Fix duplicate error when using generator in Dict (#53151)
Fixes: #33147
Replaces/Closes: #40445
The difference here, compared to past implementations, is that we use
the zero-cost `isiterable` check on every intermediate step, instead of
wrapping the call in a try/catch and then trying to re-approximate the
`isiterable` afterwards. Some samples:
```julia
julia> Dict(i for i in 1:3)
ERROR: ArgumentError: AbstractDict(kv): kv needs to be an iterator of 2-tuples or pairs
Stacktrace:
[1] _throw_dict_kv_error()
@ Base ./dict.jl:118
[2] grow_to!
@ ./dict.jl:132 [inlined]
[3] dict_with_eltype
@ ./abstractdict.jl:592 [inlined]
[4] Dict(kv::Base.Generator{UnitRange{Int64}, typeof(identity)})
@ Base ./dict.jl:120
[5] top-level scope
@ REPL[1]:1
julia> Dict(i => error("$i") for i in 1:3)
ERROR: 1
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:35
[2] (::var"#3#4")(i::Int64)
@ Main ./none:0
[3] iterate
@ ./generator.jl:48 [inlined]
[4] grow_to!
@ ./dict.jl:124 [inlined]
[5] dict_with_eltype
@ ./abstractdict.jl:592 [inlined]
[6] Dict(kv::Base.Generator{UnitRange{Int64}, var"#3#4"})
@ Base ./dict.jl:120
[7] top-level scope
@ REPL[2]:1
```
The other unrelated change here is that `dest = empty(dest, typeof(k),
typeof(v))` is made conditional, so we do not unconditionally construct
an empty Dict in order to discard it and allocate an exact duplicate of
it, but only do so if inference wasn't precise originally.
Co-authored-by: Curtis Vogt <curtis.vogt@gmail.com>