effects: refine `:nothrow` when `exct` is known to be `Bottom` (#52270)
Implements effects refinement that goes in the reverse direction of what
was implemented in 8dd0cf5.
In the discussion at JuliaLang/julia#52268, there's a debate on how to
deal with exceptions
like `StackOverflowError` or `InterruptException` that are caused by
environment. The
original purpose of #52268 was to fix issues where methods that could
cause a
`StackOverflowError` were mistakenly refined to `:nothrow`. But now it
feels like it's a bit
weird to model such environment-dependent exceptions as `:nothrow` in
the first place. If we
can exclude environment-dependent errors from the `:nothrow` modeling,
those methods might
be safely considered `:nothrow`. To prevent the concrete evaluation of
methods that may
cause `StackOverflowError`, it's enough to taint its `:teminates` after
all.
This commit excludes environment-depending errors from the `:nothrow`
modeling, reverting the changes from #52268 while making it explicit in
the `Effects` and `Base.@assume_effects` docstrings.
Anyway, now the compile is able to prove `:nothrow`-ness of the
following frame:
```julia
function getindex_nothrow(xs::Vector{Int}, i::Int)
try
return xs[i]
catch err
err isa BoundsError && return nothing
rethrow(err)
end
end
```