pathFromString is pure now and returns the error message instead of silently failing.

unsafePerformIO remains in ReadPath and print the error from there.