Rework get_kernel_path logic

The contents manager is responsible for providing an API path where kernels can start. The base implementation always gives the empty string, causing kernels to be launched in the same directory as the server. FileContentsManager gives the API path to the directory containing the notebook, since it knows that that corresponds to a real filesystem path.

The contents manager no longer has the option of supplying an absolute filesystem path, since distinguishing between an API path and a filesystem path is not reliable. The kernel manager is responsible for turning the API path into a filesystem path, or ignoring it altogether.

Supersedes #6999.