This is a larger change:

- I have corrected the semantics of ret e: it evaluates first (to ret
v), then returns the boxed value
- I have eliminated the concept of dead: there is no point: all live v
is a dead v. There is no point in giving it a different name
-However, this has mandated the change in concept: live e is a value,
much like a function encapsulation is a value.
- From thsi the derived rules for fork and bind are a bit more
complicated: Example for fork:

   e2 -->* live e3
---------------------------------
 fork e1 e2 -->* fork e1 (live e3) 
 
 e1 -->* live e4
---------------------------------
 fork e1 (live e3) -->* (live e4) (live e3)
 
These two both from regular application context rule. 

fork (live e) (live e') --> fork (live e'') (live e')
and 
fork (live e) (live e') --> fork (live e) (live e'')
(with usual assumptions)
and finally
fork (live v) (live e') --> live { v, live e' }
fork (live e) (live v') --> live { live e, v' }
fork (live v) (live v') --> live { v, v' }

Similarly for bind
e >>= e' -->* live e'' >>= e'

e'' -> e'''
-----------------------------------
live e'' >>= e' -->  live e''' >>= e'

and finally

live v >>= e --> e v

This was important to maintain the semantics of fork, but also to cut
down on the needless "dead" category.