bingobot blindly uses the shell's working dir to write logs and read
configs. This change introduces the following changes:
1. start.sh now determines the project root's absolute path before
reading the token file and starting the app.
2. the config package now determine's the executable's working directory
(rather than assuming it's the same as the shell's) before loading
configs. It also now exposes this for use in other packages.
3. the logging package now uses config.GetWorkingDir() to determine
where to write logs.
slog.HandlerOptions.AddSource is a cool feature, but since we moved the
logger to a separate package it no longer works. It now always shows
source info for the log package, rather than the code that called it.
This change removes it.
Before, we were exposing a Logger as logging.Log. This works, but
results in code calling Logger.Log.Info() which is a little wordy.
Instead, the logger is now kept private and we expose Info, Warn and
Error as public functions that wrap logger.Info, logger.Warn and
logger.Error.