Consistently avoid type-checking unreachable code (#15386)
- On module-level, now we'll skip remaining statements once unreachable.
This brings the behavior in line with function-level behavior.
- For module and function code, if `--warn-unreachable` is enabled,
we'll emit an error, just once, on the first unreachable statement
that's not a no-op statement. Previously a no-op statement would not
have the "Unreachable statement" error, but the subsequent statements
did not have the error either, e.g.
```diff
raise Exception
assert False # no error since it's a "no-op statement"
-foo = 42
+foo = 42 # E: Unreachable statement
spam = "ham" # no error since we warn just once
```