Add checkpoint/restore functionality to nsinit and libcontainer

New code was added to nsinit and libcontainer to use the criu(8) utility
to checkpoint and restore a container.

While there are no hard-coded assumptions about Docker, the new C/R
functionality has only been tested with Docker containers.

The nsinit command line usage for checkpoint and restore is consistent
with the rest of nsinit commands.  However, for easier C/R usage, the
user can specify the container ID on the command line.  The best way
to get started is to run "nsinit checkpoint --help" and look at the
"EXAMPLE:" section.

Signed-off-by: Saied Kazemi <saied@google.com>
Here and elsewhere where you're handling paths, why not just use filepath.Join ?

```go
aufsDir := filepath.Join(libcontainerDir, "../../aufs")
rootFs := filepath.Join(aufsDir, "mnt", containerId)
...
f, err := os.Open(filepath.Join(aufsDir, "layers", containerId))
...
aufsBranches := filepath.join(aufsDir, "diff", containerId)
...
for scanner.Scan() {
    aufsBranches = aufsBranches + ":" + filepath.Join(aufsDir, "diff", scanner.Text())
}
```

The paths get an implicit `filepath.Clean` when you use `filepath.Join` but looking at it I think that would be appropriate in all of these cases (but I might be mistaken about that, so make sure that's OK to you.)