MultiLogger becomes ArtifactorLoggerAdapter

Trying to do normal things with utils.log.logger, I discovered that it was
not actually a logger, nor did it pretend to be. As a result, I replaced
utils.log.logger with a LoggerAdapter instance, which implements (albeit
verbosely) the entire public logger interface (probably... :D) while still
doing its job of passing log messages back to the artifactor via fire_hook.

Additionally, since `nth_frame_info` was generally useful, I used it for `soft_assert` reporting.

This can be tested by watching the log and making sure the log messages have the correct filename and line number as compared to the actual location of the logging call. Here's a simple test for soft_assert:
```python
def test_sa(soft_assert):
    soft_assert(False)
    soft_assert(None)
    soft_assert(0, 'Zero!')
```

When run, py.test should look like this:
```
E           SoftAssertionError: 
E           soft_assert(False) (test_sa.py:2)
E           soft_assert(None) (test_sa.py:3)
E           Zero! (test_sa.py:4)
```