lagann: add parent middlewares package
lib: add utils package
lagann/middlewares: add etcd ssh key auth middleware
move middlewares into lib
middlewares/auth: bail out on an auth error
deprecate X-Lagann-Auth
middlewares: introduce correct auth header checker

RIP SSH key-based header. You were a cool idea while you lasted. :(
middlewares/auth: document all functions better
lib/utils: move lagann/main.reply into a util function
lib/utils: add simple password hashing function
lagann/datatypes: User now has a Password
lagann: use auth, break into several servemuxes

Giant commit for good reason

All routed HandleFuncs are in a file based on if they are prelogin or
postlogin.
lagann: move internal views to their own file

Also get rid of that dirty reply() function completely.
lagann/main: remove unused startUnit

    "A real man never dies, even when he's killed!"
     - Kamina
lagann/main: update for servemux oddities
lagann: login, you are implemented
Merge pull request #12 from Xe/lagann/auth

lagann: support authentication.

Ref #9

This is a giant pull request that completely changes how the
routing in Lagann works. Lagann now uses three routers:

 - `routing` for / and all child paths
 - `appmux` for internal API calls
 - `usermux` for API calls that need user auth

Thanks to the magic of Negroni, they can each have a separate
middleware stack and I can get the benefits of allowing some
routes to require authentication by the new `X-Lagann-Auth`
header as well as getting the advantage of Drone's router where
it makes sense, all while keeping things devilishly simple.

    λ curl -X POST --data "username=xena&password=foo&sshkey=$(cat .ssh/id_rsa.pub)" http://127.0.0.1:3000/register
    {
	    "code":200,
	    "data":[
		    {"authkey":"fb0bde3f-7820-488d-b0cc-f35b8bb3f427","user":"xena"}
    	],
    	"message":"User xena created."
    }

    λ curl -X POST --data "username=xena&password=foo&sshkey=$(cat .ssh/id_rsa.pub)" http://127.0.0.1:3000/register
    {
    	"code":409,
    	"data":null,
    	"message":"User xena already exists"
    }

    λ curl -X POST --data "username=xena&password=foo" http://127.0.0.1:3000/login
    {
	"code":200,
	    "data":[
		    {"authkey":"bc5c493e-7bc5-4d41-a1e4-9b7ec3b37a2a","user":"xena"}
    	],
    	"message":"Logged in as xena."
    }

    λ etcdctl get /flitter/lagann/users/xena/password
bSNmDdYlIt8KRUdR8XLOgxXMsAEMJX+o4M0u+BKXKag=


    λ curl -H "X-Lagann-Auth: bc5c493e-7bc5-4d41-a1e4-9b7ec3b37a2a" -X POST http://127.0.0.1:3000/user/create --data '{"name": "foobang", "user": ["xena"]}'
    {
    	"code":200,
    	"data":null,
	    "message":"App foobang created"
    }

    λ curl -X POST http://127.0.0.1:3000/user/create --data '{"name": "foobang", "user": ["xena"]}'
    {
    	"code": 401,
    	"message": "Not authorized",
    	"data": ["Try setting X-Lagann-Auth."]
    }