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)
Yeah, I would definitely love to see some wrappers on this, especially if we could get most callers of this code using a version of this that doesn't have to hard-code `/etc/passwd` (I love having that path be OS-specific like you've got below, even though this is a pretty linux-specific class/library right now).  I think it's good to keep in mind that this is being used outside of libcontainer/Docker too, so having an interface that is simple to use in the default case is a good thing.

Regarding whether proliferation of simple wrapper functions is a bad thing, I think it's absolutely a great thing, as evidenced by their use within the Go standard library itself.  So I think having a wrapper that lets us just pass in file paths would be good (obviously containing this boiler-plate code of opening the files etc.), and then also a wrapper that requires no filenames to be passed in at all and just uses the functions provided within the module to have sensible defaults.