Refactor and expose private functions within `libcontainer/user`.

This patchset refactors much of the code in `user/` (such as using structs to return user data and general readability improvements), exposes several previously private functions (`parsePasswdFile`, `parseGroupFile`) to allow for callers to pass `io.Reader`s as a data source (massively improving the usability of the package) and adds several exhaustive unit tests for RunUser parsing.

Also, the gargantuan function signature `user.GetUserGroupSupplementaryHome` was changed to the more readable and understandable `user.GetRunUser`.

This patch was created to assist the implementation of docker/docker#7537, in order to ensure the RunUser configuration parsing can be handled consistently both internally to libcontainer, as well as external to libcontainer.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com> (github: cyphar)
I have no problem with adding wrappers (like `ParsePasswdFileFilter` or something similar), where you pass a file path instead of an `io.Reader` and it treats errors the same way `user` does currently.

Also, the main difference between `os/user` and `libcontainer/user` is that `libcontainer` deals with more than one system and deals with abstract representations of containers and implements them on Linux. While I do agree that passing file paths makes the interface look simpler, it removes some of the functionality gained by using Readers.