Use binary strings for paths

- Python path function are consistent with the input type they are given
  i.e. if you pass in a 'bytes' parameter that will be the return type
  you will get. Since we also use byte strings for
  discover_runtime_directories() we need to be consistent when calling
  path functions.
Refactor: execfile does not exist in Python3