Question: Not even "formal symbols" such as `\[FormalX]` are guaranteed to always be symbolic. Their `Protected` argument is forgotten when they are used in `Block` and consorts, causing functions relying on symbolic variables to misbehave:

```
foo[n_] := Exponent[\[FormalX]^n, \[FormalX]];

foo[5]
Attributes@\[FormalX]

Table[{Attributes@\[FormalX], foo[5]}, {\[FormalX], 
  1}](*or Block[{\[FormalX]},...]*)

```

> 
> 5
> 
> 
> {Protected}
> 
> 
> {{{}, 0}}
> 
> 
> 

Why does `Block` clear `Attributes`? Is Unprotecting and changing a (system) symbol so common that it was decided that `Block` should do the `Unprotecting` unsolicitedly?

Is the only way to be sure that some symbol does not have an `OwnValue` to use `Module` or `Block`?

Answer: 
`Block` does something very simple: it just (temporarily) removes all definitions directly associated with a symbol, and nothing else. That includes:

* `OwnValues`, `DownValues`, `UpValues`, `SubValues`, `NValues`, `FormatValues`, `DefaultValues`, `Messages`, `Attributes`

All these are considered to be associated directly with the symbol, in the sense that `Attributes[x]` are considered to belong to `x` and not to `Attributes`.

Don't think of this as "Block does Unprotect, then block does ClearAll". Think of it as all symbol properties being reset to the default value, which is empty, `{}`, except for some special builtins such as `$ContextPath` or `$Assumtpions`.

Related:

* [Copying one symbol into another](https://mathematica.stackexchange.com/q/19902/12)
This is not an answer as to *why*, wolfram-language-design wise, but to how:

It seems `Block[{x = new}, ...code...]` effectively does the following:

```
newValue = new;
allValues = allValuesAndAttributesAssociatedWith[x];
Unprotect[x];
ClearAll[x];
x = newValue;
try {
    ...code...
} finally {
    allValuesAndAttributesAssociatedWith[x, allValues]
}

```

where the pseudo-code `finally`-block is executed no matter what happens inside `...code...`, even on `Abort` or `Throw`. 

I tried to capture the exact order of execution of all steps.

`ClearAll[x]` clears all kinds of attributes and values associated with `x`, including `Messages`, `FormatValues` etc.