[FrameworkBundle] Refactored assets:install command, tweaked output

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Before:
![screenshot from 2014-12-21 09 27 48](https://cloud.githubusercontent.com/assets/162986/5517698/3f6e62e2-88f8-11e4-9d9f-f90877058431.png)

After:
![screenshot from 2014-12-21 03 41 21](https://cloud.githubusercontent.com/assets/162986/5517700/52892d4e-88f8-11e4-8944-3461c4318b06.png)
![screenshot from 2014-12-21 03 37 20](https://cloud.githubusercontent.com/assets/162986/5517702/58ea047e-88f8-11e4-8bef-40c65c130012.png)

I think the output is much readable this way. It slightly changes the behaviour as well, instead of falling back to hard copy when relative symlink does not work it will fall back to absolute symlink and then to hard copy. When hard copying fails it does not stop immediately. I'm not sure about BC and it can be a bug fix as well as the code was superfluous in some cases inside the catch block [@AssetsInstallCommand.php#L110](https://github.com/symfony/symfony/blob/c9129dd70f4c5ea5e28bc3f6c0de3dbd669e0a21/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php#L110) IMHO.
this method looks weird.

from my point of view this is a misuse of try / catch

          if (!file_exists($target)) {
                throw new IOException(.....);
               }
           } catch (IOException $e) {

thy not just something like this? is there really a need for recursion?

    $this->filesystem->symlink($this->filesystem->makePathRelative($origin, realpath(dirname($target))), $target);
    if (!file_exists($target)) {
         $this->filesystem->symlink($origin, $target);
    }


returning the Value of $relative doesnt make sense to me.